day1训练(省赛前)

考完期中考试的弱鸡补题恢复状态ing.

416div2A.

(水题

#include <bits/stdc++.h>
#define ll long long
#define s second
#define f first
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=1e5+10;
using namespace std;
int main(){
	ll n,m;cin>>n>>m;
	int cnt1=0;int t=1e5;
	inc(i,1,t){
		if(m<1ll*i*(i+1)){
			cnt1=i-1;break;
		}
	}
	int cnt2=0;
	inc(i,1,t){
		if(n<1ll*i*i){
			cnt2=i-1;break;
		}
	}
	//cout<<cnt1<<" "<<cnt2<<endl;
	if(cnt1>=cnt2) cout<<"Vladik"<<endl;
	else cout<<"Valera"<<endl;
	return 0;
}

 416div2B.(水题

#include <bits/stdc++.h>
#define ll long long
#define s second
#define f first
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=1e4+10;
using namespace std;
int a[MAXN];
int main(){
	int n,m;cin>>n>>m;
	inc(i,1,n) cin>>a[i];
	int l,r,x;int cnt,cnt1;
	inc(i,1,m){
		cin>>l>>r>>x;
		if(x<l||x>r){
			cout<<"Yes"<<endl;continue;
		}
		int t1=x-l+1;cnt=cnt1=0;
		inc(j,l,r){
			if(a[j]<a[x]) cnt++;
			if(a[j]==a[x]) cnt1++;
		}
		if(cnt+cnt1>=t1&&cnt<t1) puts("Yes");
		else puts("No");
	}
	return 0;
}

 416div2E

题意:http://codeforces.com/contest/811/problem/E

题解:考虑到线段树维护并查集,难点在如何维护合并,考虑到每次合并只需要最左边的一列和最右边的一列 所以我们考虑将左儿子的两端的两列和右儿子两端的两列映射到数组中 然后用并查集维护合并区间的连通性 查询即可。

#include <bits/stdc++.h>
#define ll long long
#define s second
#define f first
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=1e5+10;
using namespace std;
ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
    return f*x;
}
int n,m,q,cnt;
int G[11][MAXN],vis[MAXN*10],fa[44];
int a[5];
typedef struct node{
	int l,r,ans;
	int L[11],R[11];
}node;
node d[MAXN<<2];
int find1(int x){
	if(x==fa[x]) return x;
	else return fa[x]=find1(fa[x]);
}
node merge(node x,node y){
	node z;z.ans=x.ans+y.ans;
	inc(i,1,n){
		if(vis[x.L[i]]) fa[i]=vis[x.L[i]];
		else vis[x.L[i]]=i,fa[i]=i;
	}
	inc(i,1,n){
		if(vis[x.R[i]]) fa[i+n]=vis[x.R[i]];
		else vis[x.R[i]]=n+i,fa[i+n]=n+i;
	}
	inc(i,1,n){
		if(vis[y.L[i]]) fa[i+2*n]=vis[y.L[i]];
		else vis[y.L[i]]=i+2*n,fa[i+2*n]=i+2*n;
	}
	inc(i,1,n){
		if(vis[y.R[i]]) fa[i+3*n]=vis[y.R[i]];
		else vis[y.R[i]]=i+3*n,fa[i+3*n]=i+3*n;
	}
	a[1]=x.l;a[2]=x.r;a[3]=y.l;a[4]=y.r;
	inc(i,1,n){
		if(G[i][x.r]!=G[i][y.l]) continue;
		int t1=find1(n+i);
		int t2=find1(n*2+i);
		if(t1==t2) continue;
		if(t1>t2) swap(t1,t2);
		z.ans--;
		fa[t2]=t1;
	}
	inc(i,1,n) z.L[i]=(find1(i)-1)*m+x.l;
	inc(i,1,n){
		int t1=find1(3*n+i);int t2=(t1-1)/n+1;int t3=(t1-1)%n+1;
		z.R[i]=(t3-1)*m+a[t2];
	}
	inc(i,1,n) vis[x.R[i]]=vis[x.L[i]]=vis[y.L[i]]=vis[y.R[i]]=0;
	z.l=x.l;z.r=y.r;
	return z;
}
void built(int rt,int l,int r){
	if(l==r){
		d[rt].l=d[rt].r=l;
		d[rt].L[1]=d[rt].R[1]=l;d[rt].ans++;
		inc(i,2,n){
			if(G[i][l]==G[i-1][l]) d[rt].L[i]=d[rt].R[i]=d[rt].L[i-1];
			else d[rt].L[i]=d[rt].R[i]=(i-1)*m+l,d[rt].ans++;
		}
		return ;
	}
	int mid=(l+r)>>1;
	built(rt<<1,l,mid);
	built(rt<<1|1,mid+1,r);
	d[rt]=merge(d[rt<<1],d[rt<<1|1]);
}
bool flag;node ttt;
void querty(int rt,int ql,int qr){
	if(ql<=d[rt].l&&d[rt].r<=qr){
		if(!flag) ttt=d[rt],flag=1;
		else ttt=merge(ttt,d[rt]);
		return ;
	}
	int mid=(d[rt].l+d[rt].r)>>1;
	if(ql<=mid) querty(rt<<1,ql,qr);
	if(qr>mid) querty(rt<<1|1,ql,qr);
}
int main(){
	n=read();m=read();q=read();
	inc(i,1,n){
		inc(j,1,m) G[i][j]=read();
	}
	built(1,1,m);
	int l,r;
	inc(i,1,q){
		l=read();r=read();
		flag=0;querty(1,l,r);
		printf("%d\n",ttt.ans);
	}
	return 0;
}

480div2E

题意:http://codeforces.com/contest/980/problem/E

题解:考虑到数越大对答案的贡献越大 我们可以从大往小考虑 对于每个点 我们来考虑是否应该删除(及这个点目前的深度加上已经保留点的个数是否小于n-k来判断删除的必要性 为什么这么做?可以仔细推一下

#include <bits/stdc++.h>
#define ll long long
#define s second
#define f first
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=1e6+10;
using namespace std;
ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
    return f*x;
}

int n,k;
vector<int>vec[MAXN];
vector<int>vv;
int d[MAXN<<2],flag[MAXN<<2],dep[MAXN],p[MAXN],fp[MAXN],cnt,num[MAXN],fa[MAXN];
bool vis[MAXN];
void dfs(int v,int pre,int deep){
	p[v]=++cnt;fp[cnt]=v;dep[v]=deep+1;num[v]=1;
	fa[v]=pre;
	for(int i=0;i<vec[v].size();i++){
		int u=vec[v][i];
		if(u!=pre){
			dfs(u,v,deep+1);
			num[v]+=num[u];
		}
	}
}
void push(int x){
	if(flag[x]){
		flag[x<<1]+=flag[x];
		flag[x<<1|1]+=flag[x];
		d[x<<1]+=flag[x];
		d[x<<1|1]+=flag[x];
		flag[x]=0;
	}
}
void built(int rt,int l,int r){
	if(l==r){
		d[rt]=dep[fp[l]];flag[l]=0;return ;
	}
	int mid=(l+r)>>1;
	built(rt<<1,l,mid);
	built(rt<<1|1,mid+1,r);
}
void update(int rt,int l,int r,int ql,int qr,int vul){
	if(ql<=l&&r<=qr){
		d[rt]+=vul;flag[rt]+=vul;return ;
	}
	int mid=(l+r)>>1;
	push(rt);
	if(ql<=mid) update(rt<<1,l,mid,ql,qr,vul);
	if(qr>mid) update(rt<<1|1,mid+1,r,ql,qr,vul);
}
int querty(int rt,int l,int r,int t){
	if(l==r) return d[rt];
	int mid=(l+r)>>1;
	push(rt);
	if(t<=mid) querty(rt<<1,l,mid,t);
	else querty(rt<<1|1,mid+1,r,t);
}
int main(){
	n=read();k=read();int u,v;
	inc(i,1,n-1){
		u=read();v=read();
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	dfs(n,0,0);
	built(1,1,n);
	int cnt1=0;
	for(int i=n;i>=1;i--){
		if(vis[i]) continue;
		int t1=querty(1,1,n,p[i]);
		if(t1+cnt1<=n-k){
			for(int j=i;(vis[j]==0)&&(j!=0);j=fa[j]) update(1,1,n,p[j],p[j]+num[j]-1,-1),vis[j]=1,cnt1++;
		}
		else vv.push_back(i);
	}
	sort(vv.begin(),vv.end());
	for(int i=0;i<vv.size();i++) printf("%d ",vv[i]);
	printf("\n");
	return 0;
}

  

原文地址:https://www.cnblogs.com/wang9897/p/9022509.html

时间: 2024-09-23 03:45:53

day1训练(省赛前)的相关文章

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

APIO2018 被屠记

占坑 day0 10:40才起床 感觉一点也不好 下午去了趟80中拿牌子然而没有到,白浪费我颓废时间. day0.5 早上第一课讲二分凸优化,有点瞌睡 第二课讲匹配相关,感觉这篇文章涵盖了大部分内容 下午第一课whx讲折纸啥的,根本连不上,咕掉了. 然后和Gery几个人溜了,他们几个人看电影去了..感觉不如不溜 day1 竞赛日 赛前Flag:我要上100,Gery要AK 前30min,读了T1,感觉不会 读了T2,不会 T3没读完,弃了 想了1h发现T1能想到的方法都特别难写 T3没仔细想感觉

2019CCPC女生赛小菜鸡打铜记

2018年十二月底加入acm,2019年一月正式开始训练,到六月份去南京第一次参加女生赛,感觉做梦一样(其实还是因为自己太菜了) 一开始决定参加女生赛时候有过小小犹豫,因为临近期末复习周,加上自己实力又菜,我也很无奈哇,但是yl给了我超级多信心!之后的训练和赛前准备,yl和yt都付出了非常多努力!在线拥抱我的队友们! 一号到南京我们仨玩了大半天,也是疯狂被鸭血粉丝和汤包支配的一天! 二号早上很顺利,酒店的位置刚刚好,附近有早点,打个车过去时间也非常盈余. 热身赛的时候本来想测万能头,但是队友都觉

XJOI网上同步训练DAY1 T3

思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q的数量也确定了.所以序列长度也确定了,设m为序列长度. 而且对于每个a[i]都代表了一个固定数量的p和q和长度. 因此,长度大于m/2的前缀,我们可以用总的p和总的q减去它,转换成小于等于m/2长度的前缀后缀. 这样我们可以设计DP为f[i][j][k],代表从左往右i个中有j个p,从右往左i个有k

【NOI赛前训练】——专项测试1&#183;网络流

T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列变为不下降数列的最小花费. 题解: 第一部分(上下界最小费用可行流): 设$h_0=-inf,h_{n+1}=inf$,令$a$为$h$的差分数组,即$a_i=h_{i}-h_{i-1}$.考虑当对于区间$[l,r]$操作时(比如+1),相当于$a_{r+1}$减少1,$a_{l}$增加1.若将$

[NOI赛前训练]——专项测试3&#183;数学

由于并不想写T1和T2的题解……所有只有T3的题解了. T3 由于内部题就只写题解了. 好吧,我是一点都不想写…… 说一下这zz题解哪里写错了吧…… ……不想写…… 就说一个吧…… $n-\frac{k-i}{2}$应该是$\frac{k-i}{2}$. 好累啊,完全不想写题解,有空再说吧. 1 #include "bits/stdc++.h" 2 3 using namespace std; 4 5 const int N=4e2+10; 6 7 double f[N][N],p[N

恢复性训练day1

DP: 0/1背包一个常见的错误是没有cmax(f[i][j],f[i-1][j]) 0/1背包的拓展中有转移式的变形,以及无限数量背包,分组背包等. 可化为背包问题的一般不会太难. 数组开小,出现大量不明数据.int与long long范围的问题:出现负数以及不明数据.审题出现错误(by one是后面才看到的).不了解国际象棋(更重要的是英语水平需要提高).Husan与Hussain打成husan与hussain.未考虑全所有的情况.前面(立)的flag后面忘掉.floyed的正确写法忘了,导

[2019CSP-S赛前训练][CF894E] Ralph and Mushrooms

题目链接:https://www.luogu.org/problem/CF894E 题目大意 Ralph打算去蘑菇森林采蘑菇. 蘑菇森林里有n个蘑菇丛,有m条有向的路连接这些丛林(可能连向自己,也可能两个丛林之间有多条路).经过某条路时,Ralph可以采走这条路上的全部蘑菇.然而,这是一片神奇的蘑菇森林,蘑菇被采走后会重新长出来一些.但是,第k次走过这条路后,这条路上重新长出的蘑菇会比上次少k.(举个栗子,第一次有w个蘑菇,第二次有w-1个蘑菇,第三次有w-1-2个蘑菇,以此类推--)(还有,蘑

工程训练大赛心得体会

从开学的筹备到期末时的比赛,工程训练大赛真的用了一学期的时间在其中付出了很多收获也很多,熬过通宵体验过什么叫做心急如焚,比赛前几个小时尝试过从新做小车,有时候真的不知道自己的潜力到底有多大,以前需要几天甚至几个星期才能做出来的车,在大家齐心协力的合作下几个小时就被做出来了,我想最令人难忘的就是在赛前把车子摔坏了,然后大家齐心协力一起重新做一辆车,并且在比赛前完成所有的调试工作. 大家都说团队合作很重要,刚开始我也不知道要怎么团队合作,走过不少弯路,知道比赛将近的时候我们小组完全凝聚起来了,小组之