CDCPC有感

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDCPC有感相关的知识,希望对你有一定的参考价值。

又是一年女队名额,只能说一年比一年差了有点,比赛前一天睡太多了导致比赛当天太困了Zzzzz

复盘了之后深刻意识到保持脑子清晰有多重要,思维题选手居然把签到题做成了数论题实在不能忍受,再不好好打代码我是狗好吧

最终4题,2题在手里debug,还有一题有点思路没有然后了

B:比赛当场推公式的我有多狼狈,看完题解后我就有多崩溃,果然是没睡醒

实际上来说,就是求n个数字的排列种类

我:???什么fft,什么玩意儿woc

反正拿着队友给的几个结论,最后把公式推出来了,是我

D:是谁用矩阵快速幂写斐波那契,啊是我

切最多种类就是从1*1、2*2开始切,直到最大和次大的边长和比n小,明显斐波那契。

有笨蛋写了半天没看出来斐波那契,换给队友后队友说要用O(1)算斐波那契,刚好这学期两场校赛都出了矩阵快速幂,然后比赛当场快速预习(找板子)

结果,直接暴力就行,tmd

安慰自己,学会了快速幂

H:模拟,题目太长不放上来了,反正交给挂件做了,然后挂件卡了小一会,不过我也不想看了就是说

J:我亚索贼牛()

当第一个是敌方小兵的时候,无解

否则,可以通过来回蓄力来达到重点

考虑如果遇到自己的小兵就踏,否则就斩,当没力的时候就来回蓄力,每次通过+6s来+2力

在结果的地方,如果还有力的话说明可以在上一个踏的地方改成砍,因为蓄力一定是在没力的之后,所以一定是往前踏的时候改成砍,来回-2力-2s,解决

天,我有多久没用出一遍过的题了,太感动了

#include<bits/stdc++.h>
using namespace std;
struct XD
	int t,l,r,lo;
;
XD a[100005];
bool cmp(XD a,XD b)

	return a.l<b.l;

int main()

	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	
		cin>>a[i].t>>a[i].l>>a[i].r;
		a[i].lo=a[i].r-a[i].l+1;
	
	sort(a+1,a+1+m,cmp);
	if(a[1].t==2) 
		cout<<"0/21/0\\n";
		return 0;
	
	long long ans=0,powe=0;
	bool post=0;
	
	for(int i=1;i<=m;i++)
	
		if(a[i].t==1)
		
			ans+=a[i].lo*3;
			powe+=a[i].lo;
		//	cout<<i<<" "<<ans<<" "<<powe<<"\\n";
		
		else
		
			if(powe<a[i].lo)
			
				int z=a[i].lo-powe;
				if(z%2==0) 
				
					ans+=(z/2)*6;
					powe=0;

				
				else
				
					ans+=(z/2+1)*6;
					powe=1;
				
				
			
			else
			
				powe-=a[i].lo;
			
			ans+=a[i].lo;
			
		//	cout<<i<<" "<<ans<<" "<<powe<<"\\n";
		
	
	if(powe>=2)
	
		int z=powe/2;
		ans-=2*z;
	
	cout<<ans<<"\\n";

F:和队友交流了一下思路就去看其他题了,导致这题最后有bug,唉,赛后自己写了一遍,还真写bug了,最后自测样例过了,不知道还有没有其他bug。

社恐很好处理,扔到空位就行,社牛的话就要找能做的桌子中序号最小点

考虑维护剩余不同空位的桌子的堆,分别为1,2,3,4个空位的堆,每次提出最大点

但是有个问题,人走了之后堆不好处理

考虑建一个数组,储存每个桌子的空位数量,在每次修改人数的时候都通过查询空位将桌子加入对应的堆中,此时会出现一个桌子被重复储存,但其中肯定有一个是在正确的堆里,因此当提出的最大点和记录的空位数量不太一致的时候,直接扔掉就ok啦

解决!

上码!

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map>  
#include<queue> 
#include<bitset>		
#include<limits.h>

//#pragma GCC optimize (2)
//#pragma G++ optimize (2)//手动开O2
#define ls (p<<1)//线段树左儿子
#define rs (p<<1|1)//线段树右儿子
#define mid (l+r>>1)//线段树mid
#define gc() getchar()
//#define int __int128//水大数
using namespace std;
#undef mid
typedef long long ll;
typedef unsigned long long ull;//卡精度
typedef pair<int, int> PII;

const int N = 1e7 + 7;
const ll mod = 1e9 + 7;
const ll INF = 1e15 + 7;
const double EPS = 1e-10;//可近似为趋近为 0 可以根据定义求导时使用
const int base = 131;//base = 13331 // hash
const int maxn = 100;
inline ll read() 
	ll a = 0; int f = 0; char p = gc();
	while (!isdigit(p))  f |= p == '-'; p = gc(); 
	while (isdigit(p))  a = (a << 3) + (a << 1) + (p ^ 48); p = gc(); 
	return f ? -a : a;

struct XD
	int id,ti,ki;
	//int nu;
;
XD x[N];
ll p[5];
ll space[N];
ll se[N][5];
ll cnt;

bool cmp(XD a,XD b)

	return a.ti<b.ti;



priority_queue<int, vector<int>, greater<int>> k[5];

int main()

	ll n;
	n=read();
	for(int i=1;i<=n;i++)
	
		cin>>se[i][1]>>x[i].ti>>x[i+n].ti>>se[i][2];
		x[i].id=i;
		x[i+n].id=i;
		x[i].ki=1;//进入 
		x[i+n].ki=0;
	
	sort(x+1,x+1+2*n,cmp);
	for(ll i=1;i<=n*2;i++)
			
		for(int j=1;j<=cnt;j++)
		
			cout<<space[j]<<" ";
		  
		cout<<"\\n";	
		ll t=x[i].id;
		if(x[i].ki==1)//进入 
		
			
			if(se[x[i].id][2]==0)//社恐 
			
				if(!k[4].empty())
				
					ll pos=k[4].top();
					k[4].pop();
					k[4-se[x[i].id][1]].push(pos);
					space[pos]=4-se[x[i].id][1];
					se[x[i].id][3]=pos;
				
				else
				
					cnt++;
					space[cnt]=4-se[x[i].id][1];
					k[4-se[x[i].id][1]].push(cnt);
					se[x[i].id][3]=cnt;
				
			
			else
			
				memset(p,0,sizeof p);
				ll x,minn=cnt+1,minx=-1;

				for(ll j=se[t][1];j<=4;j++)
				
					while(!k[j].empty())
					
						ll pos=k[j].top();
						if(j!=space[pos])k[j].pop();
						else break;
					
					if(!k[j].empty())
					
						if(minn>k[j].top())
						
							minn=k[j].top();
							minx=j;
						
					
				
				if(minx==-1)
				
					cnt++;
					space[cnt]=4-se[t][1];
					k[4-se[t][1]].push(cnt);
						se[t][3]=cnt;
				
				else
				
					space[minn]=space[minn]-se[t][1];
					k[space[minn]-se[t][1]].push(minn);
					se[t][3]=minn;
				
			
		
		else
		
			ll pos=se[x[i].id][3];
			space[pos]+=se[x[i].id][1];
			k[space[pos]].push(se[x[i].id][3]);
		
	
	cout<<cnt<<"\\n";

L:一眼记忆化搜索,队友飞快写完,然后发现要输出初始点,最后没改出来,丢

E:将一大块同色块处理成点,而边上的联通块中间连线,处理成图

上课摸鱼写题解,要pre了,不说了,先这样

以上是关于CDCPC有感的主要内容,如果未能解决你的问题,请参考以下文章

感悟观《BBC彩色二战纪录片》有感

构建之法第七,第十七章读书有感

读《构建之法》第四章有感

双色球投注技巧:红球空位杀码法

对数组的遍历 以及遍历是对数组空位的处理

App MediaFrameReader 总是返回空位图