SDOI2010选做

\(Round1~D1T1\)外星千足虫

\(BSOJ2793\)——高斯消元解异或方程组

简述

有\(n\)个数\(\{a_i\}\)
给出\(m\)个信息,每个信息给出\(\displaystyle{(\sum_{i=1}^m a_{b_i})\bmod 2}\)(\(\{b_i\}\)是\({1,2,\cdots,n}\)的子集)
求最少几次操作即可确定可能取值

Solution

\(70pts'\)

给出的信息可以转化为\(\displaystyle{\oplus_{i=1}^m a_{b_i}}\)

因此问题转化为求异或方程组最少几行就可以有解

高斯消元求自由元个数即可

复杂度\(O(n^3)\)

\(100pts'\)

考虑高斯消元集合异或操作太浪费,使用\(bitset\)优化异或的特殊情况

复杂度\(O(\frac{n^3}{64})\)

Code

int n,m,ans;
bitset<N> a[M];
int main(void){
    re int i,j;n=read()+1,m=read();
    for(i=1;i<=m;++i)
        for(j=1;j<=n;++j)a[i][j]=gc();
    for(i=1;i<n;++i){
        for(j=i;j<=m;++j)if(a[j][i])break;
        ans=max(ans,j);
        if(j>m)return puts("Cannot Determine"),0;
        if(i^j)swap(a[i],a[j]);
        for(j=1;j<=m;++j){if(i==j||!a[j][i])continue;a[j]^=a[i];}
    }
    printf("%d\n",ans);
    for(i=1;i<n;++i)puts((a[i][n])?"?y7M#":"Earth");
    return 0;
}

错误

把8行的初始设为了i+1

\(Round1~D1T2\)地精部落

\(BSOJ2794\)——补集思想简化状态+逆向递推计数dp

简述

求长度为\(n\)的排列满足任意\(i\in[2,n-1]\)有\(a_i>a_{i-1}\&a_i>a_{i+1}\)或\(a_i<a_{i-1}\&a_i<a_{i+1}\)

Solution

形象来说本题是要我们求//\和//的数量

首先考虑若排列\(\{a_i\}\)满足要求那么\(\{b_i\}(b_i=n-a_i)\)也满足要求

那么我们单求//就可以了(所以第一个不为\(1\))

紧接着我们会发现这个计数题正着做不好做,但构造任意一个序列是容易的所以我们逆推,用反构造(合法\(\rightarrow\)合法)的过程去实现\(dp\)

已经有\(1\rightarrow i\)首位为\(j\)的序列,设情况有\(dp_{i,j}\)个

  • \(j-1\)不是首位,那么交换\(j-1,j\)没有影响,贡献\(dp_{i,j-1}\)
  • \(j-1\)是首位,那么去掉\(j\),就得到一个//\序列,\(a_i\rightarrow i-a_i\)即可,贡献\(dp_{i-1,i-j+1}\)

注意滚动一下

Code

int main(void){
    re int i,j,now=0;
    n=read(),mod=read();dp[now][2]=1;
    for(i=3;i<=n;++i){
        now^=1;
        for(j=2;j<=i;++j)dp[now][j]=Mod(dp[now][j-1]+dp[now^1][i-j+1]);
    }
    for(i=2;i<=n;++i)ans=Mod(ans+dp[now][i]);
    printf("%d\n",Mod(ans+ans));
    return 0;
}

\(Round1~D1T3\)大陆争霸

\(BSOJ2795\)——最短路+拓扑排序

简述

给出一个有向图,有一些点必须在限制他的点之后到达他,求\(1\rightarrow n\)的最短路

Solution

考虑到限制实际上是让我们满足限制关系\(DAG\)拓扑序的去完成最短路

因此我们就魔改最短路,加入\(Topsort\)的过程即可

设\(dis_x\)表示\(1\rightarrow x\)的最短路(中间未\(Topsort\)完不一定满足要求)
\(real_x\)表示满足拓扑序关系下\(1\rightarrow x\)的实际最短路(限制我的都被走完)

注意:每次用\(real\)去更新\(dis\),只有被限制的更新完了才去更新别的,这样才保证拓扑序

Code

核心

inline void Dijkstra(void){
    re int i,x,v,d;
    for(i=1;i<=n;++i)dis[i]=INF;
    q.push((Node){1,dis[1]=real[1]=0});
    while(!q.empty()){
        x=q.top().x,d=q.top().dis,v=max(dis[x],real[x]),q.pop();
        if(v^d)continue;
        for(i=h[x];i;i=e[i].next){
            re int y=e[i].to;
            if(v+e[i].v<dis[y]){dis[y]=v+e[i].v;if(!deg[y])q.push((Node){y,max(dis[y],real[y])});}
        }
        for(re int y:g[x]){real[y]=max(real[x],v);if(!--deg[y])q.push((Node){y,max(real[y],dis[y])});}
    }
}

\(Round1~D2T1\)所驼门王的宝藏

\(Round1~D2T3\)星际竞速

给一张\(DAG\),有边权,每个点有出发点权.求最小代价使得每个点都被经过。

遇到点权就拆入出点

建图:对起点\((S,i',1,a_i)\):表示从\(i\)直接出发

\((S,i,1,0),(i',T,1,0)\)

对每条边\((x',y,1,w_{x,y})\)

跑最小费用流即可

\(Round2~D1T3\)猪国杀

原文地址:https://www.cnblogs.com/66t6/p/12076458.html

时间: 2024-11-09 03:40:11

SDOI2010选做的相关文章

[SDOI2016]部分题选做

听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4517 数论题,我这种不会错排的数论白痴都能手推出来,这题应该谁都能写吧. #include<cstdio> #include<cstring> #include<algorithm> #define mo 1000000007 #define ll long long #define N 1000100 using nam

20165201 课下作业第十周(选做)

#20165201 课下作业第十周(选做) 相关知识点总结 补做代码运行结果截图 补做代码链接 相关知识点的总结 课上内容的补做,结果截图 教材第十五章的代码分析 补做教材第十五章的编程题目 提交补做的博客作业的连接 主动找老师进行作业答辩 原文地址:https://www.cnblogs.com/cbmwtsl/p/9000384.html

20165334 第十三周选做

20165334 第十三周选做 设计并实现一个Book类,定义义成Book.java,Book 包含书名,作者,出版社和出版日期,这些数据都要定义getter和setter. 定义至少三个构造方法,接收并初始化这些数据.覆盖(Override)toString方法,返回良好的含有多行的书的描述信息.覆盖equals方法,书名,作者,出版社和出版日期完全一致才说明两本书是一样的. 创建一个测试类Bookshelf, 其中的main方法创建并更新几个Book对象.Book至少包含三本本学期教材内容.

20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义

20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然后在验证通过后再取出. 2.在Book.java中储存测试类中输入的数据,然后验证信息是否一样,一样则输出,否则就返回false. 测试代码 Bookself.java public class Bookself { public static void main(String[] args) { Book

类定义(课下选做)

类定义(课下选做) 要求 Book类包含书名,作者,出版社和出版日期 数据都要定义getter和setter 至少三个构造方法,接收并初始化这些数据 覆盖toString方法,返回良好的含有多行的书的描述信息 覆盖equals方法,书名.作者.出版社和出版日期完全相同说明两本书相同. 创建一个测试类BookShelf 思路 根据要求最好分为两个类,即Book和BookShelf 在Book类中定义四个getter,返回书名.作者.出版社和出版日期 在BookShelf类中定义四个setter,赋

20175314薛勐 程序设计中临时变量的使用(课下测试,选做)

程序设计中临时变量的使用(课下测试,选做) 要求 定义一个数组:int arr[] = {1,2,3,4,5,6,7,8}; 打印原始数组的值:for(int i:arr){System.out.print(i + " "); } System.out.println();// 添加代码删除上面数组中的5 ... 打印出 1 2 3 4 6 7 8 0:for(int i:arr){System.out.print(i + " ");} System.out.pri

20175314薛勐 数据结构-排序(选做)

数据结构-排序(选做) 要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学

数据结构-排序(选做) 20175204

数据结构-排序(选做) 任务要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己

20175209 《MySort》和《IO-myhead》选做

20175209 <MySort>和<IO-myhead>选做 一.MySort 1.题目要求 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链接. 2.设计思路 题目中要求为对第二列进行排序,个人设计时希望能够控制对所有列进行排序,因此需要在命令行中输入待排序的列号(这里存在一些小问题在后面问题中说明) 对于给定的字符数组无法直接进行排序,采用split方法将每一行分解后将带排序的列中