首页 > 其他分享 >Codeforces 1621H - Trains and Airplanes

Codeforces 1621H - Trains and Airplanes

时间:2023-07-20 12:11:13浏览次数:24  
标签:ch return val int Airplanes Codeforces mid MAXN Trains

这能 3500?

对于一组在 \(u\) 上的询问,考虑每种线路 \(x\),假设 \(1\to u\) 路径上线路 \(x\) 的长度为 \(len\),那么不难发现收罚款的次数只有两种可能:\(\lfloor\dfrac{len}{T}\rfloor\) 或者 \(\lfloor\dfrac{len}{T}\rfloor+1\),且对于一个 \(v\) 满足 \(z_u=z_v\) 且 \(v\) 在 \(u\) 子树内,并且从 \(v\) 开始走到 \(1\) 交罚款的次数为前者,那么满足 \(dis_v\bmod T\) 属于环上一段区间,而 \(k\) 只有 \(26\),所以本质不同的段最多只有 \(26\) 种,离散化,然后使用线段树合并则可以知道是否存在符合要求的 \(v\) 满足 \(dis_v\bmod T\in[l,r]\),如果存在就更新答案即可。时间复杂度 \(O((n+q)k\log n)\),好像有不带 log 做法,懒得研究了,能过就行(

坑点:\(\lfloor\dfrac{len}{T}\rfloor·fine_c\) 可能会爆 long long。

const int MAXN=2e5;
const int MAXK=26;
const int MAXP=MAXN*80;
const ll INF=1e18;
int n,K,T,qu,nd[MAXK+5],cst[MAXK+5],fa[MAXN+5];
int hd[MAXN+5],to[MAXN*2+5],nxt[MAXN*2+5],val[MAXN*2+5],ec;
void adde(int u,int v,int w){to[++ec]=v;val[ec]=w;nxt[ec]=hd[u];hd[u]=ec;}
char str[MAXN+5];ll dis[MAXN+5],res[MAXN+5];
struct node{int ch[2],val;}s[MAXP+5];
int rt[MAXN+5],ncnt=0;
void modify(int &k,int l,int r,int p,int v){
	if(!k)k=++ncnt;s[k].val+=v;if(l==r)return;
	int mid=l+r>>1;
	if(p<=mid)modify(s[k].ch[0],l,mid,p,v);
	else modify(s[k].ch[1],mid+1,r,p,v);
}
int merge(int x,int y,int l,int r){
	if(!x||!y)return x+y;int mid=l+r>>1,z=++ncnt;
	if(l==r)return s[z].val=s[x].val+s[y].val,z;
	s[z].ch[0]=merge(s[x].ch[0],s[y].ch[0],l,mid);
	s[z].ch[1]=merge(s[x].ch[1],s[y].ch[1],mid+1,r);
	s[z].val=s[x].val+s[y].val;
	return z;
}
int query(int k,int l,int r,int ql,int qr){
	if(!k||ql>qr)return 0;
	if(ql<=l&&r<=qr)return s[k].val;int mid=l+r>>1;
	if(qr<=mid)return query(s[k].ch[0],l,mid,ql,qr);
	else if(ql>mid)return query(s[k].ch[1],mid+1,r,ql,qr);
	else return query(s[k].ch[0],l,mid,ql,mid)+query(s[k].ch[1],mid+1,r,mid+1,qr);
}
void dfs0(int x,int f){
	modify(rt[x],0,T-1,dis[x]%T,1);fa[x]=f;
	for(int e=hd[x];e;e=nxt[e]){
		int y=to[e],w=val[e];if(y==f)continue;
		dis[y]=dis[x]+w;dfs0(y,x);
		if(str[x]==str[y])rt[x]=merge(rt[x],rt[y],0,T-1);
	}
}
vector<tuple<vector<int>,vector<int>,int> >qv[MAXN+5];
vector<int>pt[MAXN+5];
void dfs(int x,int f){
	if(x!=1)pt[str[x]-'A'].pb(x);
	vector<tuple<int,ll,ll> >itvls;
	for(int i=0;i<K;i++)if(!pt[i].empty()&&i!=str[x]-'A')
		itvls.pb(mt(i,dis[fa[pt[i][0]]]+1,dis[pt[i].back()]));
	for(auto t:qv[x]){
		vector<int>N=get<0>(t),C=get<1>(t);int id=get<2>(t);
		ll sum=0;vector<pii>eve;
		for(auto tt:itvls){
			int v=get<0>(tt);ll l=get<1>(tt),r=get<2>(tt);
			ll v0=((r-l+1)/T<=INF/C[v])?min((ll)N[v],1ll*((r-l+1)/T)*C[v]):N[v];
			ll v1=((r-l+1)/T<=INF/C[v])?min((ll)N[v],1ll*((r-l+1)/T+1)*C[v]):N[v];
			sum+=v0;
			if(v0!=v1){
				int _l=l%T,_r=(r+1)%T;
				if(_l==_r)continue;
				if(_l<=_r)eve.pb(mp(_l,v1-v0)),eve.pb(mp(_r,-(v1-v0)));
				else{
					eve.pb(mp(_l,v1-v0)),eve.pb(mp(T,-(v1-v0)));
					eve.pb(mp(0,v1-v0)),eve.pb(mp(_r,-(v1-v0)));
				}
			}
		}
		eve.pb(mp(T,0));eve.pb(mp(0,0));sort(eve.begin(),eve.end());
		ll mn=INF,cur=0;
		for(int i=0;i+1<eve.size();i++){
			cur+=eve[i].se;
//			printf("!!! %d %d %d\n",eve[i].fi,eve[i+1].fi-1,query(rt[x],0,T-1,eve[i].fi,eve[i+1].fi-1));
			if(query(rt[x],0,T-1,eve[i].fi,eve[i+1].fi-1))
				chkmin(mn,cur+sum);
		}
		res[id]=mn;
	}
	for(int e=hd[x];e;e=nxt[e]){
		int y=to[e];if(y==f)continue;
		dfs(y,x);
	}
	if(x!=1)pt[str[x]-'A'].ppb();
}
int main(){
	scanf("%d",&n);
	for(int i=1,u,v,w;i<n;i++)scanf("%d%d%d",&u,&v,&w),adde(u,v,w),adde(v,u,w);
	scanf("%d%s",&K,str+1);
	for(int i=1;i<=K;i++)scanf("%d",&nd[i]);
	for(int i=1;i<=K;i++)scanf("%d",&cst[i]);
	scanf("%d%d",&T,&qu);dfs0(1,0);
	for(int i=1;i<=qu;i++){
		static char buf[5];int opt;scanf("%d",&opt);
		if(opt==1){
			int v;scanf("%s%d",buf+1,&v);
			nd[buf[1]-'A'+1]=v;res[i]=-1;
		}else if(opt==2){
			int v;scanf("%s%d",buf+1,&v);
			cst[buf[1]-'A'+1]=v;res[i]=-1;
		}else{
			vector<int>ND,CST;int u;scanf("%d",&u);
			for(int j=1;j<=K;j++)ND.pb(nd[j]),CST.pb(cst[j]);
			qv[u].pb(mt(ND,CST,i));
		}
	}
	dfs(1,0);
	for(int i=1;i<=qu;i++)if(res[i]!=-1)printf("%lld\n",res[i]);
	return 0;
}

标签:ch,return,val,int,Airplanes,Codeforces,mid,MAXN,Trains
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1621H.html

相关文章

  • Educational Codeforces Round 151
    AB略C(简)将密码\(P\)与\(S\)进行匹配,按顺序决定\(P_i\),为了避免\(P\)成为\(S\)的子串,每次贪心地选择当前匹配位置最靠后的。若出现匹配不上则“YES”。D有点意思。从基础的情况入手:设\(\{s_i\}\)为\(\{a_i\}\)的前缀和,弄出\(\{s_i\}\)的图像,让我们考虑第一个......
  • Codeforces Round 885 (Div. 2)
    Preface打的就是依托答辩居然也能上分,看来手稳还是重要的说D题半场开香槟以为随便写,然后没想到怎么处理这个局部没有三分性的函数,直接GG后面听学长一说其实分成四种函数分别求最值即可直接恍然大悟,只能说还是太菜太菜而且F好像是个蓝桥杯的某个题的弱化版,我说比赛的时候怎么那......
  • Codeforces Round 882 div.2 A
    Smiling&Weeping----总有人间一两风,填我十万八千梦A.TheManwhobecameaGodtimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutput Kars istiredand......
  • Codeforces Round 885
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1848。我现在手里有三套题要补呃呃这套是两天前补的了,所以简单写写。太好玩辣,多校!A考虑一个2x2的矩阵,若小波奇和她的辣妹朋友位于对角线上就会被辣妹朋友堵在墙角,若相邻则永远抓不到。发现移......
  • Codeforces Round #885 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn,m,k;cin>>n>>m>>k;intx,y;cin>>x>>y;boolok=1;for(inti=1;i<=k;i++)......
  • Codeforces Round 885 (Div. 2)
    A.VikaandHerFriends枚举所有的点,判断是否存在点与Vika的距离和其他k个人的距离的奇偶性不同。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=998244353;voidsolve(){intn,m,k,sx,sy;cin>>n>>m>>k>......
  • CodeForces 1848E Vika and Stone Skipping
    洛谷传送门CF传送门感觉比这场的F简单。发现我们要进行\(x\)不断乘一些数然后求答案的操作,猜测答案与\(x\)的因数有关。如果你对数字比较敏感,不难发现答案就是\(x\)的奇因子个数。官方题解的证明:设\(x=f+(f-1)+\cdots+(f-(c-1))\),由等差数列求和公......
  • Codeforces Round 885 (Div. 2) A-D
    A.VikaandHerFriends题意:有一个n*m大小的矩阵,vika在点(a,b),她的k个朋友在分别(xi,yi),所有人每分钟都可以上下左右走一格,每一分钟vika先走,她的朋友后走,不能不走,问vika能否躲过朋友。Solution结论题,只要有一个朋友和她的距离是奇数,那么她肯定会被追上。voidsolve(){ int......
  • Codeforces Round #885(Div. 2)C
    C.维卡和价格标签每个测试的时间限制为1秒每个测试的内存限制为256兆字节输入:标准输入输出:标准输出维卡来到她最喜欢的化妆品店"GoldenPear"。她注意到n个物品的价格自她上次光顾以来发生了变化。她决定分析价格的变化,并计算每个物品的旧价格和新价格之间的差异。维卡喜......
  • Codeforces Round #885 (Div.2) Editorial
    B-VikaandtheBridge题意:从桥的一边走到另一边,每次只能踩在相同颜色的木板上,并且有一次操作,可以修改期中一个模板的颜色。问那种走法,跨过模板的最大值最小。思路:首先可以统计出选择每种颜色的,跳过木板的的个数,如果不能修改颜色,那么答案一定是每个颜色所对应的最大值的最小......