SDOI2017 R2 Day2

2018.4.29 Test

时间:7:30~11:30(实际没用多少)
实际得分:0+20+30=50

总结

LOJ总题目链接

T1 BZOJ.4912.[SDOI2017]天才黑客

题目链接

T2 BZOJ.4913.[SDOI2017]遗忘的集合

题目链接

正解生成函数什么的
部分分有点坑
弃了

T3 BZOJ.4914.[SDOI2017]文本校正

题目链接

考试代码

T1

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=5e4+5,S=2e4+5;

int n,m,k,l1,l2,Enum,H[N],to[N],nxt[N],len[N],pos[N],Ans[N];
char s1[S],s2[S];
struct Trie
{
    int c[S],dep[N],to[S],nxt[S],H[S],Enum,top[S],fa[S],son[S],sz[S],id,pos[S];

    inline void Add(int u,int v,int w){
        to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, c[Enum]=w;
    }
    void Init(){
        Enum=0, memset(H,0,sizeof H), id=0;
    }
    void DFS1(int x)
    {
        int mx=0; sz[x]=1, son[x]=0;
        for(int v,i=H[x]; i; i=nxt[i])
            if((v=to[i])!=fa[x])
            {
                fa[v]=x, dep[v]=dep[x]+1, DFS1(v), sz[x]+=sz[v];
                if(mx<sz[v]) mx=sz[v], son[x]=v;
            }
    }
    void DFS2(int x,int tp)
    {
        top[x]=tp, pos[x]=++id;
        if(son[x]){
            DFS2(son[x],tp);
            for(int i=H[x]; i; i=nxt[i])
                if(to[i]!=fa[x]&&to[i]!=son[x]) DFS2(to[i],to[i]);
        }
    }
    int Query(int u,int v)
    {
        if(u==1||v==1) return 0;
        while(top[u]!=top[v])
        {
            if(dep[top[u]]<dep[top[v]]) std::swap(u,v);
            u=fa[top[u]];
        }
        return dep[u]<dep[v]?dep[u]:dep[v];
    }
}t;

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline void AddEdge(int u,int v,int w,int p){
    to[++Enum]=v, len[Enum]=w, nxt[Enum]=H[u], pos[v]=p, H[u]=Enum;
}

int main()
{
    freopen("hack.in","r",stdin);
//  freopen("hack.out","w",stdout);

    int T=read();
    while(T--)
    {
        memset(Ans,0x7f,sizeof Ans);
        memset(H,0,sizeof H);
        Enum=0;
        n=read(),m=read(),k=read();
        for(int u,v,w,i=1; i<=m; ++i)
            u=read(),v=read(),w=read(),AddEdge(u,v,w,read());
        for(int u,v,i=1; i<k; ++i)
            u=read(),v=read(),t.Add(v,u,read());
        for(int x=1; x<=n; ++x)
            for(int i=H[x]; i; i=nxt[i])
                len[i]+=t.Query(pos[x],pos[to[i]]);

    }
    fclose(stdin);fclose(stdout);
    return 0;
}

T2

#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=(1<<18)+5;//262149

int n,p,f[N],g[N],cnt,s[N];
long long ans;

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
void DFS(int sta,int pur,int sum)
{
    if(sum==pur) ++ans;
    else{
        for(int i=sta; i<=cnt; ++i)
            if(sum+s[i]<=pur) DFS(i,pur,sum+s[i]);
            else break;
    }
}
void Spec()
{
    srand(20180430);
    for(int i=1; i<=n; ++i) s[i]=i;
    bool flag=0;
    for(int i=1; i<=25; ++i)
    {
        s[++cnt]=i, ans=0, DFS(1,i,0), ans%=p;
        if(ans>f[i]) {flag=1; break;}
    }
    if(!flag) cnt+=rand()%(n-cnt)+1;
    --cnt;
    printf("%d\n",cnt);
    for(int i=1; i<=cnt; ++i) printf("%d ",s[i]);
}

int main()
{
    freopen("set.in","r",stdin);
    freopen("set.out","w",stdout);

    n=read(),p=read();
    for(int i=1; i<=n; ++i) f[i]=read();
    if(n>5000) {Spec(); return 0;}
    if(f[1]) s[++cnt]=1;
    if(f[2]>1||(f[2]&&!f[1])) s[++cnt]=2;
//  g[0]=1, g[1]=f[1], g[2]=f[2];
    for(int i=3; i<=n; ++i)
    {
//      for(int j=1; j<=cnt/*&&s[j]<=i*/; ++j)
//          (g[i]+=g[i-s[j]])%=p;
//      ++g[i], g[i]>>=1;
        ans=0, DFS(1,i,0), ans%=p;//O(2^cnt)
//      printf("%d:%lld\n",i,ans);
        if(ans!=f[i]) s[++cnt]=i;
    }
    printf("%d\n",cnt);
    for(int i=1; i<=cnt; ++i) printf("%d ",s[i]);

    fclose(stdin);fclose(stdout);
    return 0;
}

T3

#include <cstdio>
#include <cctype>
#define gc() getchar()
typedef unsigned long long ull;
const int N=1e6+5;
const ull seed=200009;

int n,m,S[N],T[N];
ull pw[N],hs_S[N],hs_T[N];

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
void Init(int n){
    pw[0]=1;
    for(int i=1; i<=n; ++i) pw[i]=pw[i-1]*seed;
}
inline ull Get_Hash(int l,int r,ull *hs){
    return hs[r]-hs[l-1]*pw[r-l+1];
}

int main()
{
//  freopen("fix.in","r",stdin);
//  freopen("fix.out","w",stdout);

    Init(1000000);
    int Case=read(),pos1,pos2,l1,l2,l3;
    ull hs1,hs2,hs3;
    while(Case--)
    {
        n=read(),m=read();
//      if(n>5000) break;
        for(int i=1; i<=n; ++i) S[i]=read();
        for(int i=1; i<=n; ++i) T[i]=read();
        for(int i=1; i<=n; ++i)
            hs_S[i]=hs_S[i-1]*seed+S[i],hs_T[i]=hs_T[i-1]*seed+T[i];
        int f=0;
        for(int i=1; i<n&&!f; ++i)
            for(int j=i+1; j<n; ++j)
            {
                l1=i, l2=j-i, l3=n-j;
                hs1=Get_Hash(1,i,hs_T), hs2=Get_Hash(i+1,j,hs_T), hs3=Get_Hash(j+1,n,hs_T);
//              printf("%d %d %lld %lld %lld\n",i,j,hs1,hs2,hs3);
                if((hs1==Get_Hash(1,i,hs_S)&&hs2==Get_Hash(i+1,j,hs_S)&&hs3==Get_Hash(j+1,n,hs_S))) f=1;
                else if((hs1==Get_Hash(1,i,hs_S)&&hs3==Get_Hash(i+1,i+l3,hs_S)&&hs2==Get_Hash(i+l3+1,n,hs_S))) f=2;
                else if((hs2==Get_Hash(1,l2,hs_S)&&hs1==Get_Hash(l2+1,l2+l1,hs_S)&&hs3==Get_Hash(l2+l1+1,n,hs_S))) f=3;
                else if((hs2==Get_Hash(1,l2,hs_S)&&hs3==Get_Hash(l2+1,l2+l3,hs_S)&&hs1==Get_Hash(l2+l3+1,n,hs_S))) f=4;
                else if((hs3==Get_Hash(1,l3,hs_S)&&hs1==Get_Hash(l3+1,l3+l1,hs_S)&&hs2==Get_Hash(l3+l1+1,n,hs_S))) f=5;
                else if((hs3==Get_Hash(1,l3,hs_S)&&hs2==Get_Hash(l3+1,l3+l2,hs_S)&&hs1==Get_Hash(l3+l2+1,n,hs_S))) f=6;
                if(f) {pos1=i, pos2=j; break;}
            }//按拼接顺序。。
        switch(f)
        {
            case 0: puts("NO"); break;
            case 1: printf("YES\n%d %d\n%d %d\n%d %d\n",1,pos1,pos1+1,pos2,pos2+1,n); break;
            case 2: printf("YES\n%d %d\n%d %d\n%d %d\n",1,pos1,pos2+1,n,pos1+1,pos2); break;
            case 3: printf("YES\n%d %d\n%d %d\n%d %d\n",pos1+1,pos2,1,pos1,pos2+1,n); break;
            case 4: printf("YES\n%d %d\n%d %d\n%d %d\n",pos1+1,pos2,pos2+1,n,1,pos1); break;
            case 5: printf("YES\n%d %d\n%d %d\n%d %d\n",pos2+1,n,1,pos1,pos1+1,pos2); break;
            case 6: printf("YES\n%d %d\n%d %d\n%d %d\n",pos2+1,n,pos1+1,pos2,1,pos1); break;
        }
    }
//  fclose(stdin);fclose(stdout);
    return 0;
}

原文地址:https://www.cnblogs.com/SovietPower/p/8970857.html

时间: 2024-08-29 06:26:42

SDOI2017 R2 Day2的相关文章

SDOI2017 Round1 Day2 题解

T2好厉害啊--AK不了啦--不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配.费用流跑得过,可以不用KM. #include<bits/stdc++.h> #define pb push_back using namespace std; typedef double flo; const int inf=1e9; const int N=205; struct edge{ int v,c; flo w; }e[20400]; vec

【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformation, 快速傅里叶变换, 是DFT(Discrete Fourier Transform, 离散傅里叶变换)的快速实现版本. 据说在信号处理领域广泛的应用, 而且在OI中也有广泛的应用(比如SDOI2017 R2至少考了两道), 所以有必要学习一波.. 划重点: 其实学习FFT最好的教材是<算法导论

Day2 - Python模块-01

模块,用一堆代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. 如:os 是系统相关的模块:file是文件操作相关的模块 模块分为三种: 自定义模块 第三方模块 内置模块 1.自定义模块 情景一: 情景二: 情景三: 2.导入模块 Python之所以应用越来越广泛,在一定程度

解决 U盘安装Windows Server 2012 R2 报错

报错原因: 使用UltraISO刻录镜像时会更改U盘的文件格式为FAT32, 而Server 2012 R2的安装文件install.wim为5G多,故安装失败. 解决方法: 1.按照正常的方法刻录镜像到U盘: 2.更改U盘文件系统: 进入命令行模式,输入 convert f: /fs:NTFS (F盘为我的U盘所在盘符) 3.把install.wim重新拷贝到U盘对应目录

ORACLE11g R2【RAC+ASM→单实例FS】

ORACLE11g R2[RAC+ASM→单实例FS] 11g R2 RAC+ASMà单实例FS的DG,建议禁用OMF. 本演示案例所用环境:   primary standby OS Hostname node1,node2 std OS Version RHEL6.5 RHEL6.5 DB Version 11.2.0.4 11.2.0.4 db_name stephen stephen db_unique_name stephen standby service_names stephen

Windows 2008 R2安装wamp server

一.平台windows 2008 R2,安装驱动,office 2010: 二.安装SP1补丁包,下载地址https://www.microsoft.com/zh-cn/download/details.aspx?id=5842 具体见附件1: 三.安装Microsoft Visual C++ 2015运行库 14.0.23026.0: 四.安装wamp server 3.0.6.即可

Windows server 2008 R2 AD DS搭建(额外DNS)

使用额外的DNS服务器搭建AD DS服务器,AD DS服务器本身不是DNS服务器. 先决条件: 1台DNS服务器,1台AD DS服务器: DNS服务器开启动态更新: 部署参考步骤如下: 1.DNS服务器信息检查 2.AD DS服务器信息检查 3.在DNS服务器上面运行dnsmgmt.msc,确定 4.右击"正向查找区域",选择"新建区域" 5.选择下一步 6.选择"主要区域" 7.输入域名"contoso.local",下一步

部署FIM 2010 R2&mdash;&mdash;6安装和配置PCNS

部署FIM 2010 R2--6安装和配置PCNS 在所有域控安装安装PCNS 1. 如果第一次安装PSNS需要扩展构架,如果之前安装过PCNS,略过此步骤,扩展构建需要在CMD进入PCNS安装目录中运行"Password Change Notification Service.msi" SCHEMAONLY=TRUE 下载PCNS安装包,首先在每台DC上扩展架构, msiexec /i "C:\Users\Administrator\Desktop\Password Cha

部署FIM 2010 R2&mdash;5配置Synchronization Service

部署FIM 2010 R2-配置Synchronization Service 配置多有域环境账户密码同步 在各个域创建ADMA账户,并赋予对域的复制目录更改和复制目录更改所有项权限:和对用户的密码重置和解锁密码权限: 在fim01所使用的DNS服务器上,建立同步密码目标域的DNS条件转发:并测试能正常解析目标域: 确保fim01到目标域的域控制器的TCP和UDP端口389.88.464能双向正常通信: 1.打开Synchronization Service窗口, 2.选择Management