首页 > 其他分享 >Codeforces Round 864 (Div. 2) C和D

Codeforces Round 864 (Div. 2) C和D

时间:2023-04-09 20:57:22浏览次数:50  
标签:cout int 864 Codeforces xx ti Div st dp

比赛地址

C. Li Hua and Chess

题意:给出一个棋盘长宽n,m,有一颗棋子在棋盘上,向八个方向走一步的路程代价都为1,现在进行最多3次询问,问能否确认棋子的位置

Solution

第一次做交互题,想很好想,先询问(1,1),得到x,再询问(1+x,1+x),得到y,最后询问(1+x,1+x-y),如果得到的是0,则输出这个点,反之输出(1+x-y,1+x)

不过有个坑,看到了但是我只看到了一半,1+x可能比n或m小,所以第二次询问时要分别跟n和m判断一下,与1+x横坐标和纵坐标都取小,询问的时候也是

好像关闭了输入流就不能用fflush(stdout)?

void solve()
{
	int n,m;cin>>n>>m;
	cout<<"? 1 1"<<"\n";
	cout.flush();
	int x;cin>>x;
	int y;
	cout<<"? "<<n<<" "<<m<<"\n";
	cout.flush();
	cin>>y;
	int ansx=0,ansy=0;
	if(x+y==n)
	{
		cout<<"?"<<" "<<x<<" "<<x<<"\n";
		cout.flush();
		int z;cin>>z;
		cout<<"!"<<" "<<x<<" "<<x-z<<"\n";
		cout.flush();
	}
	else if(x+y==m)
	{
		cout<<"?"<<" "<<x<<" "<<x<<"\n";
		cout.flush();
		int z;cin>>z;
		cout<<"!"<<" "<<x-z<<" "<<x<<"\n";
		cout.flush();
	}
}

D. Li Hua and Tree

题意:给出一颗树,每个节点上都有一个权值a[i],定义重儿子为非叶子节点的子结点中子树大小最大的子结点

进行q次操作:

1:1 x,输出以x的子树和x上所有点的权值和

2:2 x,让x的重儿子的父节点变为x的父节点,让x的重儿子变成x的父节点,将如果x是叶子,不继续操作

Solution

操作很简单,树形dp记录最初的状态后,维护一下每个节点的重儿子即可,这里用set+结构体重载运算符维护

struct node
{
	int x,y;
	bool operator < (const node& b) const{
		if(x!=b.x)return x > b.x;
		return y < b.y;
	}
};
int a[N];
vector<int>e[N];
int dp[N];
int t[N];
set<node>st[N];
int p[N];
void dfs(int x,int pre)
{
	dp[x]=a[x];
	t[x]=1;
	for(auto it:e[x])
	{
		if(it==pre)continue;
		dfs(it,x);
		p[it]=x;
		dp[x]+=dp[it];
		t[x]+=t[it];
		node xx;
		xx.x=t[it],xx.y=it;
		st[x].insert(xx);
	}

}


void solve()
{
	int n,q;cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<n;i++)
	{
		int u,v;cin>>u>>v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	//for(int i=1;i<=n;i++)cout<<dp[i]<<"\n";
	while(q--)
	{
		int op,x;cin>>op>>x;
		if(op==1)cout<<dp[x]<<"\n";
		else
		{
			if(st[x].size()==0)continue;
			int ts=st[x].begin()->x;
			int ti=st[x].begin()->y;
			int xx=dp[x]-dp[ti];
			int yy=t[x]-ts;
			st[p[x]].erase({t[x],x});
			st[p[x]].insert({t[x],ti});
			st[ti].insert({yy,x});
			st[x].erase(st[x].begin());
			dp[ti]=dp[x];
			dp[x]=xx;
			t[ti]=t[x];
			t[x]=yy;
			p[ti]=p[x];
			p[x]=ti;
		}
	}
}

标签:cout,int,864,Codeforces,xx,ti,Div,st,dp
From: https://www.cnblogs.com/HikariFears/p/17301013.html

相关文章

  • 练习记录-cf-div2-856(A-C)
    vp的写出4道C感觉目前不是能力范围以后有机会留下来打比赛的话再说A-PrefixandSuffixArray给出字符串的前缀和后缀问是不是回文 我采用枚举长度为n-1和1的拼凑但是这并不奏效一直wa3后来改用拼两个n/2的就过了如果有大佬看到了希望能解答一下qwq#include<b......
  • 练习记录-cf-div2-864(A-D)
    状态不怎么好场上就写出3道还磨磨蹭蹭推错结论qwq 警钟长鸣A.LiHuaandMaze一开始以为要切割发现就把其中一个包起来就行了计算包某个块需要的最小块数#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingn......
  • Codeforces Round 860 (Div. 2)
    CodeforcesRound860(Div.2)Date:04/08/2023Link:CodeforcesRound860(Div.2)A|ShowstopperBrief:两组数\(\{a_i\}\)和\(\{b_i\}\),长度都为\(n\).\(\foralli\),可以交换\(a_i\)和\(b_i\),问是否可以使得\(a_n=\max(a_i)\),\(b_n=\max(b_i......
  • 【cf864】赛后结
    属实是失踪人口了,想了一下还是把题解打到这儿。conteset地址:https://codeforces.com/contest/1797 A.题目大意:n*m的方格上给两个点,询问最少增加的障碍格子使得这两个点不连通。解题思路:水题,但是手速有点慢。直接问靠不靠墙,靠几面墙,不靠墙答案4,靠一面答案3,靠两面答案2,取两个点......
  • Codeforces Round 864 (Div. 2)
    评价:A~E感觉出的挺一般,特别是D怎么放这种暴力题,场上我还没调出来,F没看。但是Orzrui_er。A在一个点周围放障碍即可。B求出最少需要的操作次数\(p\),若\(p>k\)就无解,否则若\(n\)为偶数只能任选一个格子翻偶数次,即有解当且仅当\(2\mid(k-p)\);若\(n\)为奇数可......
  • Edu Round 板刷计划 4. Educational Codeforces Round 4 题解
    ChangeLog:2023.04.06开坑.A-TheTextSplitting弱智题.枚举分出来多少个长度为\(p\)的串,则能计算出长度为\(q\)的串有多少个,若合法则直接输出即可.无解输出-1.Samplesubmission.B-HDDisOutdatedTechnology比A还弱智.直接记录每个数的位置,然后模拟一......
  • codeforces 1804D Accommodation
    https://codeforces.com/problemset/problem/1804/D解题思路每个楼层是独立的,考虑怎么解决一层就可以了。求最大值就是尽量避免1和1合并,也就是尽量在不存在连续1的子序列中进行合并,如果还有需要合并的就只能用1和1合并。求最小值就是尽量合并1和1。由于只需要输出最大最小值,所......
  • Educational Codeforces Round 146 (Rated for Div. 2)
    A.Coins#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintread(){intx=0,f=1,ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch......
  • Educational Codeforces Round 124 (Rated for Div. 2)
    题目链接C核心思路其实还是得根据样例,首先我们先自己分析出来。现根据边地数目来分析。我们其实不难发现四个端点必须得连上边。边数为2.那么只有两条竖线。方案数是一种边数为3,那么就一条竖线还有就是一把叉这里交换位置就是两条了。还有就是平行四边形和一条斜线,也是可以......
  • [CodeForces]4.7
    题目链接:https://codeforces.com/contest/1610/problem/E灵神描述输入t(≤1e4)表示t组数据。所有数据的n之和≤2e5。每组数据输入n(2≤n≤2e5)和长为n的有序数组a(1≤a[i]≤1e9),有重复元素。你需要从a中删除一些元素,对于a的任意非空子序列b,都必须满足:设avg为......