首页 > 其他分享 >CF1693 ABCD 题解

CF1693 ABCD 题解

时间:2023-02-08 11:46:05浏览次数:66  
标签:ABCD CF1693 题解 sum long int maxn define dis

题目链接:https://codeforces.com/contest/1693

这场的题都非常好啊……
因为现在是从 div1 开始做了,所以可能刚开始会有点吃力(这场我就会做一个 1B 呜呜呜)
1A
先把后缀的极长 0 段删去
考虑对于每一个 右移 操作,首先必然和一个 左移 操作一一对应(最后回到原点了),而且必然存在一种映射,使得每个左移操作的位置在右移操作的右边
也就是说每个 -1 必然在对应的 +1 右边,也就是说前面的前缀和必然都是正数
因此可以对序列做前缀和,如果 \(sum[i] \leq 0,i<n\) 那么必然不符合条件,如果 \(sum[n]\neq 0\) 同样不符合条件

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f,maxn=2e5+5;

int n;
ll a[maxn],sum[maxn];
int solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	int up=-1;
	for(int i=n;i>=1;i--)if(a[i]){up=i;break;}
	if(up==-1)return 1;
	for(int i=1;i<=up;i++)sum[i]=sum[i-1]+a[i];
	for(int i=1;i<up;i++)if(sum[i]<=0)return 0;
	if(sum[up])return 0;
	return 1;
}

signed main(){
	int te;scanf("%d",&te);
	while(te--)puts(solve() ? "Yes" : "No");

	return 0;
}

1B
贪心一下,子结点的权值之和一定 >= 父节点的

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 2e5+5;

int n;
vector<int>g[maxn];
int l[maxn], r[maxn], cnt=0;
ll sum[maxn];

void dfs(int x,int fat=0){
	if(g[x].size() == 0){
		sum[fat] += r[x];
		++ cnt;
		return ;
	}
	
	for(int u : g[x]){
		dfs(u,x);
	}
	if(sum[x] > r[x]){
		sum[x] = r[x];
	}else if(sum[x] < l[x]){
		sum[x] = r[x];
		++ cnt;
	}
	sum[fat] += sum[x];
}

void solve(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)g[i].clear(), sum[i] = 0;
	cnt = 0;
	
	for(int i=2;i<=n;i++){
		int x;scanf("%d",&x);
		g[x].pb(i);
	}
	for(int i=1;i<=n;i++)scanf("%d%d",&l[i],&r[i]);
	dfs(1);
	printf("%d\n",cnt);
}

signed main(){
	int te;scanf("%d",&te);
	while(te--)solve();

	return 0;
}

1C
这题好强……
随机走 == 最坏情况下的距离。
设 \(dis[i]\) 表示 \(i\rightarrow n\) 的答案,那么 \(dis[n] = 0\)
先考虑DAG的情况,考虑点 \(x\),将所有 \(x\) 的后继 \(u\) 按照 \(dis[u]\) 升序排好,那么:
\(dis[x]=min{dis[u]+out[x]-id_u}\) 也就是删掉比 \(dis[u]\) 距离还长的点的边,然后走 \(dis[u]\) (因为此时 \(dis[u]\) 成距离最大的了,即最坏情况)
递推即可(每次可以将图边的方向取反,然后正向递推)
那么考虑有环该如何做?
注意上面的递推过程很像 dijkstra 的实现过程,也就是说每次从堆中取出距离最小的点,因为边权为正,此时这个点的 dis 一定就是到 \(n\) 的最短距离(换言之不会被环更新了),我们这里也可以这么做。
实现和 dijkstra 基本相同,只不过边权变成了与第几次更新到这个点(当然得用 \(degree\) 减之)

// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back

using namespace std;

typedef long long ll;
typedef long long LL;

const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 2e5+5;

vector<int>g[maxn];
int dis[maxn], de[maxn], vis[maxn];
priority_queue<pii>pq; 

signed main(){
	memset(dis,0x3f,sizeof dis);
	int n,m;scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y;scanf("%d%d",&x,&y);
		g[y].pb(x);
		++ de[x];
	}
	
	dis[n] = 0;
	pq.push(mpr(-dis[n], n));
	while(!pq.empty()){
		int x = pq.top().second;pq.pop();
		if(vis[x])continue;vis[x] = 1;
		
		for(int u : g[x]){
			if(dis[x]+de[u] < dis[u]){
				dis[u] = dis[x] + de[u];
				pq.push(mpr(-dis[u], u));
			}
			-- de[u];
		}
	}
	printf("%d\n",dis[1]);

	return 0;
}

1D
这题好强……
设 \(dp[i][0]\) 代表第 \(i\) 个

标签:ABCD,CF1693,题解,sum,long,int,maxn,define,dis
From: https://www.cnblogs.com/SkyRainWind/p/17101170.html

相关文章

  • USACO 2023 January Contest, Platinum 题解
    TractorPaths题意:给定\(n\)个不交区间,两个区间之间有边当且仅当这两个区间的交非空。\(Q\)次询问,每次给定\(u,v\),求从\(u\)到\(v\)的最短路和最短路可能经过的点......
  • 黑苹果中Memory modules misconfigured问题解决
    问题大致和这个差不多,头一样,下面的不一样:大致意思是,你的内存出现了错误设置,要么成对安装,要么把模块全插满。以前版本没有这个信息,那就一定是配置造成的。按照https://dor......
  • CF14D题解
    CF14DTwoPaths题解题目链接传送门题意简述给定一棵树,找出两条不经过相同点的最长路径,使得他们的长度乘积最大。题目分析首先,如果在一棵树上,两条路径没有共同的点,那......
  • CF1785B Letter Exchange 题解(思维+模拟)
    题目链接难度:绿+。题意给定\(t\)组testcase,每组testcase如下。有\(m\)个长度为3的字符串,每个字符都是\(\text{w}\)、\(\text{i}\)、\(\text{n}\)中的一个,一......
  • HDU5126 stars题解
    HDU5126Description\(T\)组数据,给一个空的三维空间,\(Q\)次操作,分为插入一个点和查询某个立方体内点的个数。\(T\le10,Q\le5\times10^4\)Sol题目没说强制在线......
  • CF1333F Kate and imperfection 题解 线性筛
    题目链接:http://codeforces.com/problemset/problem/1333/F题目大意:kate有一个集合S,S中的元素是1到n的整数她认为集合S的一个子集M的集合的不完美值等于\(\max_{a,b\in......
  • 消息队列的延时以及过期失效,消息队列消息积压及占满问题解决思路
    大量消息在mq里积压了几个小时了还没解决几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上11点多。这个是我们真实遇到过的一个场景,确实是线上故障了......
  • CF1787I Treasure Hunt 题解
    题目链接题意描述:定义一个序列的权值为一段前缀与一段子段,满足要么前缀与子段不交,要么完全包含的和的最大值,给定一个序列\(a\),求\(a\)的所有子区间的权值和\(n\le1......
  • Django关于站点管理Admin Site的常见问题解决方法
    1.改变django默认语言的方法?仅需添加’django.middleware.locale.LocaleMiddlewar’到MIDDLEWARE_CLASSES设置中,并确保它在’django.contrib.sessions.middleware.Session......
  • Android 软键盘弹出时布局内指定内容上移实现及问题解决
    AndroidSDK目前提供的软键盘弹出模式接口只有两种:一是弹出时自动回冲界面,将所有元素上顶,一种则是不重绘界面,直接将控件元素遮住,没有其他模式,如果......