T1 三元组

发现确定\(b,c\)的情况下,\(a\)的值域是连续的。确定\(b\)后\(a+b\)的取值是\([1+b,b+b]\)。树状数组维护对每个\(b\)可行的\(c\)。

注意取模后取值可能跨越多次值域。

\(code:\)

T1

#include<bits/stdc++.h>
#define int long long
using namespace std; namespace IO{
int read(){
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
void write(int x,char sp){
char ch[20]; int len=0;
if(x<0){ putchar('-'); x=~x+1; }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
}
inline int max(int x,int y){ return x<y?y:x; }
inline int min(int x,int y){ return x<y?x:y; }
inline void swap(int& x,int& y){ x^=y^=x^=y; }
inline void ckmax(int& x,int y){ x=x<y?y:x; }
inline void ckmin(int& x,int y){ x=x<y?x:y; }
} using namespace IO; const int NN=100010;
int T,n,k,dlt,ans,cnt[50]; namespace BIT{
int c[NN];
void insert(int pos,int x){
if(!pos) return c[0]+=x,void();
while(pos<=max(n,k)){
c[pos]+=x;
pos+=pos&-pos;
}
}
int query(int pos){
int res=c[0];
if(pos<0) return 0;
while(pos){
res+=c[pos];
pos-=pos&-pos;
}
return res;
}
} using namespace BIT; signed main(){
freopen("exclaim.in","r",stdin);
freopen("exclaim.out","w",stdout);
T=read();
for(int t=1;t<=T;t++){
n=read(); k=read();
ans=0; memset(c,0,sizeof(c));
for(int i=1;i<=n;i++) insert(i*i*i%k,1);
for(int i=1;i<=n;i++){
int l=(1+i*i)%k,r=(i+i*i)%k;
if((i%k)==0) ans+=query(k-1)*(i/k);
else if(l<=r) ans+=query(r)-query(l-1)+query(k-1)*(i/k);
else ans+=query(k-1)-query(l-1)+query(r)+query(k-1)*(i/k);
insert(i*i*i%k,-1);
}
printf("Case %lld: %lld\n",t,ans);
}
return 0;
}


T2 简单的字符串

\(n^3\)加剪枝。

\(code:\)

T2

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
namespace IO{
int read(){
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
void write(int x,char sp){
char ch[20]; int len=0;
if(x<0){ putchar('-'); x=~x+1; }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
}
inline int max(int x,int y){ return x<y?y:x; }
inline int min(int x,int y){ return x<y?x:y; }
inline void swap(int& x,int& y){ x^=y^=x^=y; }
inline void ckmax(int& x,int y){ x=x<y?y:x; }
inline void ckmin(int& x,int y){ x=x<y?x:y; }
} using namespace IO; const ULL base=6121;
const int NN=5010;
int n,ans,col[NN],sum[NN];
ULL pw[NN],has[NN];
inline ULL get(int l,int r){ return l>r?0:has[r]-has[l-1]*pw[r-l+1]; } signed main(){
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
n=read(); pw[0]=1;
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(col[i]=read());
for(int i=1;i<NN;i++) pw[i]=pw[i-1]*base;
for(int i=1;i<=n;i++)
has[i]=has[i-1]*base+(ULL)col[i];
for(int r=2;r<=n;r++) for(int l=1;l<r;l++) if((r-l)&1){
int mid=l+r>>1;
if(sum[mid]-sum[l-1]!=sum[r]-sum[mid]) continue;
ULL s2=get(mid+1,r);
for(int b=l;b<=mid;b++){
ULL s1=get(b,mid)*pw[b-l]+get(l,b-1);
if(s1==s2){ ++ans; break; }
}
}
write(ans,'\n');
return 0;
}


T3 环路

邻接矩阵的连续幂次和。

由于只需求主对角线的和,开两倍的矩阵可以统计。

\(code:\)

T3



#include<bits/stdc++.h>
using namespace std; namespace IO{
int read(){
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
void write(int x,char sp){
char ch[20]; int len=0;
if(x<0){ putchar('-'); x=~x+1; }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
}
inline int max(int x,int y){ return x<y?y:x; }
inline int min(int x,int y){ return x<y?x:y; }
inline void swap(int& x,int& y){ x^=y^=x^=y; }
inline void ckmax(int& x,int y){ x=x<y?y:x; }
inline void ckmin(int& x,int y){ x=x<y?x:y; }
} using namespace IO; const int NN=110,MM=NN<<1;
int n,m,k,ans;
char O[NN]; namespace matrix{
int ext;
struct mat{
int s[MM][MM];
void clr(){ memset(s,0,sizeof(s)); }
void pre(){ clr(); for(int i=1;i<=ext;i++) s[i][i]=1; }
mat operator*(const mat& a)const{
mat res; res.clr();
for(int i=1;i<=ext;i++)
for(int k=1;k<=ext;k++)
for(int j=1;j<=ext;j++)
(res.s[i][j]+=1ll*s[i][k]*a.s[k][j]%m)%=m;
return res;
}
}to;
void qpow(int b){
mat res; res.pre();
while(b){
if(b&1) res=res*to;
to=to*to;
b>>=1;
}
to=res;
}
} using namespace matrix; signed main(){
freopen("tour.in","r",stdin);
freopen("tour.out","w",stdout);
n=read(); ext=n<<1;
for(int i=1;i<=n;i++){
scanf("%s",O+1);
for(int j=1;j<=n;j++)
to.s[i][j]=(O[j]=='Y');
to.s[i][n+i]=to.s[n+i][n+i]=1;
}
k=read(); m=read();
qpow(k);
for(int i=1;i<=n;i++)
(ans+=to.s[i][i+n])%=m;
(ans+=m-n)%=m;
write(ans,'\n');
return 0;
}


T4 过河

发现方案肯定是先运所有关系的交集(猪王),然后每个关系运一个,之后把猪王运回来,再把其他猪运过去,最后把猪王运回去。

于是转化为二分图问题。发现猪王来回可以带两头猪,问题转化为删两个点有无方案令图为二分图。

枚举其中一个点,另一个点合法当且仅当它在所有奇环上,且它儿子的子树内不同时存在奇环与偶环上的边连向它的祖先链。建出搜索树,树上差分奇环个数即可。

\(code:\)

T4

#include<bits/stdc++.h>
using namespace std; namespace IO{
int read(){
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
}
void write(int x,char sp){
char ch[20]; int len=0;
if(x<0){ putchar('-'); x=~x+1; }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
}
inline int max(int x,int y){ return x<y?y:x; }
inline int min(int x,int y){ return x<y?x:y; }
inline void swap(int& x,int& y){ x^=y^=x^=y; }
inline void ckmax(int& x,int y){ x=x<y?y:x; }
inline void ckmin(int& x,int y){ x=x<y?x:y; }
} using namespace IO; const int NN=1010,MM=3010;
int t,n,m,ban,root,in[NN];
int idx,to[MM<<1],nex[MM<<1],head[NN],id[MM<<1];
bool Continue;
map<pair<int,int>,bool>mp;
struct relation{
int a,b,c;
}p[MM];
inline void add(int a,int b,int c){
if(mp[make_pair(a,b)]) return;
mp[make_pair(a,b)]=mp[make_pair(b,a)]=1;
to[++idx]=b; nex[idx]=head[a]; head[a]=idx; id[idx]=c;
to[++idx]=a; nex[idx]=head[b]; head[b]=idx; id[idx]=c;
} int sum,fa[NN],odd[NN],evo[NN],eve[NN],dep[NN],son[NN];
bool vis[MM],able[NN];
void clear(){
sum=0;
memset(odd,0,sizeof(odd));
memset(evo,0,sizeof(evo));
memset(eve,0,sizeof(eve));
memset(dep,0,sizeof(dep));
memset(vis,0,sizeof(vis));
memset(able,0,sizeof(able));
}
void dfs(int s,int f,int d){
dep[s]=d; fa[s]=f; able[s]=1;
for(int i=head[s];i;i=nex[i]) if(!vis[id[i]]){
int v=to[i]; vis[id[i]]=1;
if(ban==v||root==v) continue;
if(dep[v]){
int tmp=dep[s]-dep[v]+1;
if(tmp&1){
++sum; ++odd[s]; --odd[fa[v]];
++evo[s]; --evo[son[v]];
}
else ++eve[s], --eve[son[v]];
continue;
}
son[s]=v;
dfs(v,s,d+1);
if(eve[v]&&evo[v]) able[s]=0;
odd[s]+=odd[v];
eve[s]+=eve[v];
evo[s]+=evo[v];
}
} signed main(){
freopen("river.in","r",stdin);
freopen("river.out","w",stdout);
t=read();
while(t--){
n=read(); m=read(); Continue=1; idx=root=0;
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
mp.clear();
for(int a,b,c,i=1;i<=m;i++){
a=read(); b=read(); c=read();
p[i].a=a; p[i].b=b; p[i].c=c;
++in[a]; ++in[b]; ++in[c];
if(in[a]==m||in[b]==m||in[c]==m) Continue=0;
}
if(n<4){ puts("no"); continue; }
if(Continue){ puts("no"); continue; }
for(int i=1;i<=n;i++) if(in[i]==m)
if(!root) root=i;
else Continue=1;
if(Continue){ puts("yes"); continue; }
for(int i=1;i<=m;i++)
if(p[i].a==root) add(p[i].b,p[i].c,i);
else if(p[i].b==root) add(p[i].a,p[i].c,i);
else if(p[i].c==root) add(p[i].a,p[i].b,i);
for(int k=1;k<=n;k++) if(root!=k){
ban=k; clear();
for(int i=1;i<=n;i++) if(i!=root&&i!=ban&&!dep[i])
dfs(i,0,1);
for(int i=1;i<=n;i++) if(i!=root&&i!=ban)
if(able[i]&&odd[i]==sum) Continue=1;
}
puts(Continue?"yes":"no");
}
return 0;
}


2021.9.28考试总结[NOIP模拟64]的更多相关文章

  1. 2021.7.28考试总结[NOIP模拟26]

    罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...

  2. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  3. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  4. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

  5. 2021.7.29考试总结[NOIP模拟27]

    T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...

  6. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  7. 2021.9.14考试总结[NOIP模拟53]

    T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...

  8. 2021.9.12考试总结[NOIP模拟51]

    T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...

  9. 2021.9.9考试总结[NOIP模拟50]

    T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...

随机推荐

  1. git各种操作:基本操作 and 多人协作 and 冲突解决

    git基本操作 git 上次文件到远程仓库(参考:https://blog.csdn.net/beiqiaofeng123/article/details/104859326) 如果第一次上传,配置一 ...

  2. Java一般命名规范

    一.项目名称 最好用英文,所有单词全部用小写,如testjavaproject.studentmanagement等,当然也也可以用中文,如"学生管理系统"等. 二.Java pr ...

  3. 导出excel、word、csv文件方法汇总

    http://www.woaic.com/2012/06/64 excel文件主要是输出html代码.以xls的文本格式保存文件. 生成excel格式的代码: /// <summary> ...

  4. 自己用树莓派做了一个电视盒子,还可以看优酷和cctv

    我刚接触树莓派时间不久,安装过raspberry(树莓派官方系统),ubuntu mate,openelec等系统,openelec是一个电视盒子系统,但是我的用的电视机是一个老式的,老是出现闪屏的问 ...

  5. xml字符串转成数组(php)

    1 $str = '<xml> 2 <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName> 3 & ...

  6. Centos6.8阿里云linux系统下配置LAMP运行环境-mysql5.6

    1.Apache #安装apache软件 yum -y install httpd #启动httpd服务 service httpd start #设置开机启动chkconfig --list htt ...

  7. python+selenium之浏览器滚动条操作

    from selenium import webdriver import time #访问百度 driver=webdriver.Ie() driver.get("http://www.b ...

  8. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...

  9. GDOI2021划水记

    Day0 上午有意志行,一大早就醒了,然后走了五个小时脚痛.中午洗澡,宿舍轮流看巨人最终话然后聊了一个小时? 下午老师带着我和全爷先开溜,宿舍好像很破旧还还没得充电,领了牌牌和斐爷去吃饭. 然后六点多 ...

  10. Unity3D组成

    从宏观的角度来看,分为七个模块: 1.图形模块(Graphics). 2.物理模块(Physics) 3. 音效模块(Audio) 4.动作模块(Animation) 5.导航模块(Navigatio ...