codeforces1214E Petya and Construction Set

本文分享了解决 Codeforces 1214E 题目的一种构造方法,通过按距离从大到小排序并逐步构建链路,实现了对奇数和偶数点的有效连接。在长链无法继续增长时,采用优化策略处理剩余节点,确保了构造方案的正确性和效率。

http://codeforces.com/problemset/problem/1214/E

本来看到是构造题都想直接点外卖吃饭了的,一直觉得这辈子都做不出构造题,没想到脑补了一种做法过了,不知道是不是正解。

按照d从大到小排序,然后从前向后安排,先构造出一条尽可能长的链,我们将奇数点记为a[i],偶数点记为b[i]。

如果当前cnt这个位置可以放之前已经放的某一个a[id]的b[id],也就是cnt离a[id]的距离恰好的d[id],那么就放b[id],如果已经小了,那么b[id]就连向链那个位置已经放的别的数字。

一直构造到a[1...n]全部放完,长链无法再变长时,对于那些还没有安排的b[id],我们选择a[id]所在的位置向前找第d[id]个位置放b[id]。由于是按照d[id]拍过序的,所以后面要安排的d[id]都很小。

其实有更优的构造方法是对于后面无法安排的那些a[id],按照d[id]从小到大再排一次序,那么d[id]在越后面,就越不容易出错。

不过不考虑这么多的做法也过了。。。

#include<bits/stdc++.h>
#define maxl 500010
using namespace std;

int n,m,ans,cnt,tot;
struct node
{
	int d,id;
}a[maxl];
int b[maxl],dis[maxl],dy[maxl];
char s[maxl];
bool in[maxl];
vector <int> add[maxl]; 
typedef pair<int,int> p;
priority_queue<p,vector<p>,greater<p> > q;

inline bool cmp(const node &x,const node &y)
{
	return x.d>y.d;
}

inline void prework()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i].d);
		a[i].id=i;dis[i]=a[i].d;
	}
	sort(a+1,a+1+n,cmp);
}

inline void mainwork()
{
	cnt=1;p d;
	for(int i=1;i<=n;i++)
	{
		b[cnt]=2*a[i].id-1;dy[a[i].id]=cnt;
		q.push(make_pair(cnt+a[i].d,a[i].id));
		++cnt;
		while(!q.empty())
		{
			d=q.top();
			if(d.first==cnt)
			{
				q.pop();
				b[cnt]=2*d.second;
				++cnt;
			}
			else
			if(d.first<cnt)
			{
				q.pop();
				add[d.first-1].push_back(2*d.second);
			}
			else
				break;
		}
	}
	cnt--;
	int id;
	while(!q.empty())
	{
		d=q.top();q.pop();
		id=dy[d.second]-dis[d.second];
		add[id+1].push_back(2*d.second);
	}
}

inline void print()
{
	for(int i=1;i<cnt;i++)
		printf("%d %d\n",b[i],b[i+1]);
	for(int i=1;i<=cnt;i++)
	{
		int l=add[i].size();
		for(int j=0;j<l;j++)
			printf("%d %d\n",b[i],add[i][j]);
	}
}

int main()
{
	int t=1;
	//scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

### Codeforces 887E Problem Solution and Discussion The problem **887E - The Great Game** on Codeforces involves a strategic game between two players who take turns to perform operations under specific rules. To tackle this challenge effectively, understanding both dynamic programming (DP) techniques and bitwise manipulation is crucial. #### Dynamic Programming Approach One effective method to approach this problem utilizes DP with memoization. By defining `dp[i][j]` as the optimal result when starting from state `(i,j)` where `i` represents current position and `j` indicates some status flag related to previous moves: ```cpp #include <bits/stdc++.h> using namespace std; const int MAXN = ...; // Define based on constraints int dp[MAXN][2]; // Function to calculate minimum steps using top-down DP int minSteps(int pos, bool prevMoveType) { if (pos >= N) return 0; if (dp[pos][prevMoveType] != -1) return dp[pos][prevMoveType]; int res = INT_MAX; // Try all possible next positions and update 'res' for (...) { /* Logic here */ } dp[pos][prevMoveType] = res; return res; } ``` This code snippet outlines how one might structure a solution involving recursive calls combined with caching results through an array named `dp`. #### Bitwise Operations Insight Another critical aspect lies within efficiently handling large integers via bitwise operators instead of arithmetic ones whenever applicable. This optimization can significantly reduce computation time especially given tight limits often found in competitive coding challenges like those hosted by platforms such as Codeforces[^1]. For detailed discussions about similar problems or more insights into solving strategies specifically tailored towards contest preparation, visiting forums dedicated to algorithmic contests would be beneficial. Websites associated directly with Codeforces offer rich resources including editorials written after each round which provide comprehensive explanations alongside alternative approaches taken by successful contestants during live events. --related questions-- 1. What are common pitfalls encountered while implementing dynamic programming solutions? 2. How does bit manipulation improve performance in algorithms dealing with integer values? 3. Can you recommend any online communities focused on discussing competitive programming tactics? 4. Are there particular patterns that frequently appear across different levels of difficulty within Codeforces contests?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值