NOIp2018集训test-9-19(am&pm)
AM
这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155。
T1
很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??)
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=2e5+;
using namespace std;
typedef long long LL;
typedef double db;
int n,m,cnt[];
LL a[N]; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} map<LL,int>mp; LL mo(LL x,LL p) { return x>=p?x-p:x;}
LL ksc(LL a,LL b,LL p) {
if(a>=p) a%=p;
if(b>=p) b%=p;
if(a<b) swap(a,b);
LL bs=a,rs=;
while(b) {
if(b&) rs=mo(rs+bs,p);
bs=mo(bs+bs,p);
b>>=;
}
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("meaningless.in","r",stdin);
freopen("meaningless.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) {
read(a[i]);
For(j,,) if(a[i]&(1LL<<j))
cnt[j]++;
mp[a[i]]++;
}
For(i,,m) {
int o;
LL x,y,p;
read(o);
if(o==) {
read(x); read(y);
if(x==y) continue;
if(mp[x]) {
int tp=mp[x];
For(j,,) {
if((x&(1LL<<j))&&!(y&(1LL<<j))) {
cnt[j]-=tp;
}
else if(!(x&(1LL<<j))&&(y&(1LL<<j))){
cnt[j]+=tp;
}
}
mp[y]+=tp;
mp[x]=;
}
}
else {
read(p);
LL bs=1LL,ans=;
For(i,,) {
ans=mo(ans+ksc((LL)cnt[i]*(n-cnt[i])*,bs,p),p);
bs=bs*2LL%p;
}
printf("%lld\n",ans);
}
}
//cerr<<clock()<<endl;
Formylove;
}
T2
一开始一直在想数位dp,事实证明当初我不会数位dp现在仍然不会,然后看了下lucas发现很好做啊,结果少了一句话——sum[0][0]没有赋值(手拍就是不靠谱),直接炸了45分。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=,p=;
using namespace std;
typedef long long LL;
typedef double db;
int T,C[p+][p+],sum[p+][p+];
LL n,k,fac[N],inv[N]; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL lucas(LL n,LL m) {
if(n<p&&m<p) return C[n][m];
return lucas(n/p,m/p)*lucas(n%p,m%p)%p;
} LL calc(LL n,LL m) {
if(n<=p&&m<=p) return sum[n][m];
LL t1=m/p,t2=m%p,rs;
if(t1) rs=calc(n/p,t1-)*calc(n%p,)%p;
else rs=;
rs=(rs+lucas(n/p,t1)*calc(n%p,t2)%p)%p;
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("quondam.in","r",stdin);
freopen("quondam.out","w",stdout);
#endif
read(T);
For(i,,p) C[i][]=;
For(i,,p) For(j,,i) C[i][j]=(C[i-][j-]+C[i-][j])%p;
sum[][]=;
For(i,,p) {
sum[i][]=;
For(j,,p) sum[i][j]=(sum[i][j-]+C[i][j])%p;
}
while(T--) {
read(n); read(k);
LL ans=calc(n,k);
printf("%lld\n",ans);
}
//cerr<<clock()<<endl;
Formylove;
}
T3
对这题影响贼深刻,打t2之前打的t3,以为稳了,结果直接爆0。一是我经常犯的一手写队列就出错,调用队首元素总是把que[ql]直接写成ql,二是写的时候不知为何没开滚动数组,而是把更新签到数组存下来(好像和滚动是一个意思来着,无所谓了),因为要插两次,第二次插之前就复原一次,结果如果k是1的话第一次是没插的,一复原就跳到原来去了,相当于滚动数组某次没做dp却把o^=1。
一开始写的时候sb地把攻击力相同的点合并了,显然是不能合并的,因为种类不同,背包同种类之间是无差的。实际上有没有攻击力相同的点是无所谓的做法是相同的。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=,P=;
using namespace std;
typedef long long LL;
typedef double db;
int n,m,sa[N],tot,sumnow;
LL ans,cc[N]; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int v,cnt;
friend bool operator <(const node&A,const node&B) {
return A.v>B.v;
}
}p[]; LL mo(LL x) {
if(x<) {
int debug=;
}
return x<?x+P:(x>=P?x-P:x);
} LL f[N],prf[N];
int que[N],ql,qr;
void ins(int v,int cnt) {
if(!cnt) return;
For(w,,v-) {
ql=; qr=-;
LL tp=;
for(int i=w;i<=m;i+=v) {
while(ql<=qr&&(i-que[ql])/v>cnt) {
tp=mo(tp-prf[que[ql]]); ql++;
}
prf[i]=f[i];
f[i]=mo(f[i]+tp);
tp=mo(tp+prf[i]);
que[++qr]=i;
}
}
} #define ANS
int main() {
#ifdef ANS
freopen("refrigerator.in","r",stdin);
freopen("refrigerator.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) {
read(p[i].cnt); read(p[i].v);
}
sort(p+,p+n+);
For(i,,n) sumnow+=p[i].cnt*p[i].v;
f[]=;
if(sumnow<m) ans++;
For(i,,n) {
sumnow-=p[i].cnt*p[i].v;
ins(p[i].v,p[i].cnt-);
For(s,max(,m-sumnow-p[i].v),m-sumnow-)
ans=mo(ans+f[s]);
if(p[i].cnt-) For(j,,m) f[j]=prf[j];
ins(p[i].v,p[i].cnt);
}
printf("%lld\n",ans);
//cerr<<clock()<<endl;
Formylove;
}
PM
也是一年前做过的,太菜还是做不求来。
T1segment
两种做法,标解是个套路,把每个修改拆成左右两边然后按左边排序,遇见左端点就加进set遇见右端点就erase,每次遇见点的时候上个点到这个点的区间间的最大值就是set里的最大值。
我忘了这个套路,然后很sb地把修改按a大小排序,从大到小覆盖区间,每个区间第一次被覆盖的时候就是它最后的答案。用set维护区间,一开始放进一个(1,n,未覆盖)的点,每次在set里把能覆盖的区间找出来,已经被覆盖的一段连续区间合并,复杂度就很ok。也还是很好写的,stl就是好。
然而我一开始只有80pt,因为1e18的时候r-l已经是Longlong了没取膜,再乘一个int就爆了。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=1e5+,p=;
using namespace std;
typedef long long LL;
typedef double db;
int m;
LL n,ans; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct QS {
LL l,r,a;
friend bool operator <(const QS&A,const QS&B) {
return A.a>B.a;
}
}q[N]; struct node {
LL l,r;
int ok;
node(){}
node(LL l,LL r,int ok):l(l),r(r),ok(ok){}
friend bool operator <(const node&A,const node&B) {
return A.r<B.r;
}
};
set<node>s;
#define IT set<node>::iterator
LL mo(LL x) { return (x%p+p)%p; }
LL pf(LL x) { return x*x%p; } #define ANS
int main() {
#ifdef ANS
freopen("segment.in","r",stdin);
freopen("segment.out","w",stdout);
#endif
read(n); read(m);
For(i,,m) {
read(q[i].l);
read(q[i].r);
read(q[i].a);
}
sort(q+,q+m+);
s.insert(node(,n,));
For(i,,m) {
node t=node(q[i].l,q[i].r,);
node x;
node nx=node(,,),nl=node(,,),nr=node(,,);
IT it=s.lower_bound(t);
for(;;) {
if(it==s.end()) break;
x=*it;
s.erase(it--);
if(x.l>t.l&&x.r<t.r) {
if(!x.ok) ans=mo(ans+pf(q[i].a%p)*((x.r-x.l+)%p)%p);
}
if(x.r>=t.r) {
if(!x.ok) ans=mo(ans+pf(q[i].a%p)*(((t.r-max(t.l,x.l)+))%p)%p);
if(!x.ok&&x.r>t.r) {
nr=node(t.r+,x.r,);
nx.r=t.r;
}
else nx.r=x.r;
}
if(x.l<=t.l) {
if(!x.ok&&!(x.r>=t.r)) ans=mo(ans+pf(q[i].a%p)*((x.r-t.l+)%p)%p);
if(!x.ok&&x.l<t.l) {
nl=node(x.l,t.l-,);
nx.l=t.l;
}
else nx.l=x.l;
break;
}
}
if(nx.l!=) s.insert(nx);
if(nl.l!=) s.insert(nl);
if(nr.l!=) s.insert(nr);
}
printf("%lld\n",ans);
//cerr<<clock()<<endl;
Formylove;
}
T2 hotel
不知道为什么没有切这道题,有时候看到题觉得很麻烦就懒得动脑子去想,就想打个暴力部分分什么的就走,也可能没把题意理解清楚,看漏题上的条件之类的也是我经常犯的错误,题面往往是蕴含很多信息的,需要去理解,但我一看到不能秒懂的题面就会觉得头疼,这类题往往即使简单也做不出来。
前30n^2模拟,中间30线段树维护非0区间的答案。其实读懂题这步就直接通向标解了。
显然是把每个位置现在还能装多少人用线段树维护,题面告诉你这个东西非负,你把线段树区间维护非0段的信息改成维护非最小值的信息,随便处理一下就好了。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=3e5+;
using namespace std;
typedef long long LL;
typedef double db;
int n,m,w[N]; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL sg[N<<],mi[N<<],lz[N<<],sl[N<<],sr[N<<];
#define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
LL get_all(LL l) { return (l+)*l/; } void down(int x,int l,int r) {
if(!lz[x]) return;
mi[lc]+=lz[x]; lz[lc]+=lz[x];
mi[rc]+=lz[x]; lz[rc]+=lz[x];
lz[x]=;
} void upd(int x,int l,int r) {
if(mi[lc]==mi[rc]) {
mi[x]=mi[lc];
sg[x]=sg[lc]+sg[rc]+sr[lc]*sl[rc];
sr[x]=(sr[rc]==r-mid?sr[lc]+r-mid:sr[rc]);
sl[x]=(sl[lc]==mid-l+?sl[rc]+mid-l+:sl[lc]);
}
else if(mi[lc]<mi[rc]) {
mi[x]=mi[lc]; sg[x]=sg[lc]+get_all(r-mid)+sr[lc]*(r-mid);
sl[x]=sl[lc]; sr[x]=sr[lc]+r-mid;
}
else {
mi[x]=mi[rc]; sg[x]=sg[rc]+get_all(mid-l+)+sl[rc]*(mid-l+);
sr[x]=sr[rc]; sl[x]=sl[rc]+mid-l+;
}
} void build(int x,int l,int r) {
if(l==r) {
sg[x]=sl[x]=sr[x]=;
mi[x]=w[l];
return;
}
build(lc,l,mid); build(rc,mid+,r);
upd(x,l,r);
} void update(int x,int l,int r,int ql,int qr,LL w) {
if(l>=ql&&r<=qr) {
mi[x]+=w; lz[x]+=w; return ;
}
down(x,l,r);
if(ql<=mid) update(lc,l,mid,ql,qr,w);
if(qr>mid) update(rc,mid+,r,ql,qr,w);
upd(x,l,r);
} LL nlen;
LL qry(int x,int l,int r,int ql,int qr) {
if(l>=ql&&r<=qr) {
if(mi[x]>) {
LL rs=get_all(r-l+)+nlen*(r-l+);
nlen+=(r-l+);
return rs;
}
LL rs=sg[x]+nlen*sl[x];
if(sr[x]==r-l+) nlen+=sr[x];
else nlen=sr[x];
return rs;
}
down(x,l,r);
LL rs=;
if(ql<=mid) rs+=qry(lc,l,mid,ql,qr);
if(qr>mid) rs+=qry(rc,mid+,r,ql,qr);
return rs;
} #define ANS
int main() {
#ifdef ANS
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
#endif
read(n); read(m);
For(i,,n) read(w[i]);
if(n<=-&&m<=-) {
For(i,,m) {
int o,l,r,x;
read(o); read(l); read(r);
if(o==) {
read(x);
For(j,l,r) w[j]-=x;
}
else {
LL tp=,ans=;
For(j,l,r) {
if(w[j]!=) tp++;
else tp=;
if(j==r||w[j+]==)
ans+=(tp+)*tp/;
}
printf("%lld\n",ans);
}
}
}
else {
build(,,n);
For(i,,m) {
int o,l,r,x;
read(o); read(l); read(r);
if(o==) {
read(x);
update(,,n,l,r,-x);
}
else {
nlen=;
LL ans=qry(,,n,l,r);
printf("%lld\n",ans);
}
}
}
//cerr<<clock()<<endl;
Formylove;
}
T3recursion
我的数学很不好,对数字一类的东西总是很没有感觉,数学好能推柿子或者对数字有感觉的人这题应该是秒切的。但我打了半天表就只看出g是f的前缀和,硬是没看出g[g[]]是i*f的前缀和。
现在还不会证,等ycl大佬分享吧。
打表发现是前缀和以及f[i]代表i出现的次数,就随便搞了(有点像分块优化的感觉?)。
//Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=1e6+,p=;
using namespace std;
typedef long long LL;
typedef double db;
int n;
int f[N]; template<typename T>void read(T &x) {
T f=; x=; char ch=getchar();
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} LL mo(LL x) { return x>=p?x-p:x; } int F(int n) {
if(n==) f[n]=;
if(!f[n]) {
return +F(n-F(F(n-)));
}
return f[n];
} LL dc(LL l,LL r) { return (l+r)*(r-l+)/%p; } #define ANS
int main() {
#ifdef ANS
freopen("recursion.in","r",stdin);
freopen("recursion.out","w",stdout);
#endif
int tot=;
For(i,,) f[i]=F(i);
read(n);
int now=;
LL g=,gg=;
for(int i=;;i++) {
if(now+f[i]>n) {
g=mo(g+i*(n-now+)%p);
gg=mo(gg+i*dc(now,n)%p);
break;
}
g=mo(g+i*f[i]%p);
gg=mo(gg+i*dc(now,now+f[i]-)%p);
now+=f[i];
}
printf("%lld %lld\n",g,gg);
Formylove;
}
NOIp2018集训test-9-19(am&pm)的更多相关文章
- NOIp2018集训test-9-21(am/pm)
Am DAY1 抄代码 送分题 //Achen #include<bits/stdc++.h> #define For(i,a,b) for(int i=(a);i<=(b);i++ ...
- NOIp2018集训test-10-24(am&pm)
李巨连续AK三场了,我跟南瓜打赌李巨连续AK七场,南瓜赌李巨连续AK五场. DAY1 T1 qu 按题意拿stack,queue和priority_que模拟即可.特判没有元素却要取出的情况. T2 ...
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- NOIp2018集训test-9-17(pm)
T1记忆(memory) 我大概是只记忆只有七秒的金鱼吧.看了下以前的代码发现真的很简单,但是考场上只打了个暴力,虽然骗了88pt.就是枚举选的是哪个串,然后vis[i]表示选了i这些位能不能猜出它, ...
- NOIp2018集训test-9-8(pm) (联考一day2)
把T1题读错了,想了一个多小时发现不可做.然后打了t2,常数不优秀.然后去打t3,lct,结果打挂爆0了. 然后今天就爆炸了. 如果这是noip我今年就可以直接回去学常规了.学常规多好,多开心. 今天 ...
- NOIp2018集训test-9-7(pm) (联考一day1)
又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...
- NOIp2018集训test-9-6(pm)
T1T2是洛谷原题.Orz辉神290,被辉神吊起来打. 题 1 包裹快递 二分答案.这题似乎卡精度,不开long double二分500次都过不去. //Achen #include<algor ...
- NOIp2018集训test-9-5(pm)
老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...
- NOIp2018集训test-9-2(pm)
其实这套题我爆0了,T1define 写成ddefine编译错误 T2有两个变量爆int 但是我看zwh不在悄悄地改了,我心里还是十分愧疚(没有)的.主要是林巨已经虐我125了要是再虐我200分我大概 ...
随机推荐
- org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplic
org.springframework.context.ApplicationContextException: Unable to start web server; nested exceptio ...
- CF817E Choosing The Commander
\(\mathtt{CF817E}\) \(\mathcal{Description}\) 有 \(q\) 个操作\((1 \leq q \leq 10^{5})\): 1.加入一个数 \(p_i(1 ...
- kubernetes(k8s)集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
- 二叉树总结及部分Lintcode题目分析 1
1. 遍历问题 Preorder / Inorder / Postorder preorder: root left right inorder: left root right postorder: ...
- docker集群故障迁移
docker swarm 故障时候镜像迁移(无法添加新节点的时候)生产docker集群出现了故障,无法正常添加删除节点.在这样的情况下只能想办法把故障集群的镜像迁移到新的docker集群当中.将发生故 ...
- docker IPv4 forwarding is disabled. 解决方法
问题 最近在 docker 部署 django 项目打包镜像时遇到 [root@localhost ~]# docker build -t test1 . ...省略... WARNING: IPv4 ...
- SPSS把一个数据样本随机分为两部分
SPSS把一个数据样本随机分为两部分 1. 打开SPSS数据文件. 2. 选择DATA>SELECT CASES,打开"Select Cases"对话框 3. 选择&qu ...
- yum设置代理
echo "proxy=http://[proxy_url]:8080" >> /etc/yum.conf
- std::locale与boost::locale的学习
1. 什么是facet, locale facet ['fæsɪt]的原意,是宝石切割出来的一个平面. locale[ləʊˈkæl],表示本地化, locale the container that ...
- Java8中Map的遍历方式总结
在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map< ...