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有感的主要内容,如果未能解决你的问题,请参考以下文章