套路(拓扑排序)

/*
对每个联通块单独考虑。
每个联通块是一个环套树,树边拎出来可以随意定向,记树边为 m,所以树的方案数为2^m 。
对于环来说只有两种方向,顺时针和逆时针,记环边为 n,所以环的方案就是 2^n - 2。
最后把每个联通块的方案乘起来即可。
注意,自环无论如何定向都是环,但这并不违反环的公式,故可以不特判。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 200010
#define mod 1000000007
int con[maxn],deg[maxn],seq[maxn];
int n,m;
long long ans;
long long Pow(long long a,long long b){
long long res=;
while(b){
if(b&)res=res*a%mod;
a=a*a%mod;
b>>=;
}
return res;
}
void dfs(int x){
m++;
deg[x]=;
if(deg[con[x]])dfs(con[x]);
}
int main(){
freopen("road.in","r",stdin);freopen("road.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&con[i]);
deg[con[i]]++;
}
int h=,t=;
for(int i=;i<=n;i++){
if(!deg[i])seq[++t]=i;
}
while(h<=t){
int to=con[seq[h]];
deg[to]--;
if(!deg[to])seq[++t]=to;
++h;
}
ans=Pow(,t);
for(int i=;i<=n;i++){
if(deg[i]){
m=;
dfs(i);
ans=(ans*(Pow(,m)-))%mod;
}
}
ans=(ans+mod)%mod;
cout<<ans;
}

100分 拓扑排序

exLCS(动态规划)

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
#define INF 0x7fffffff
using namespace std;
char a[],b[maxn];
int f[][],nxt[maxn][];
int n,m;
void solve(){
f[][]=nxt[][a[]-'a'];
for(int i=;i<=n;i++)f[i][]=-;
for(int i=;i<n-;i++)
for(int j=;j<=n&&f[i][j]<INF;j++){
f[i+][j]=min(f[i+][j],f[i][j]);
if(j<n)f[i+][j+]=min(f[i+][j+],nxt[f[i][j]+][a[i+]-'a']);
}
}
int main(){
freopen("lcs.in","r",stdin);freopen("lcs.out","w",stdout);
scanf("%s%s",a,b);
n=strlen(a);m=strlen(b);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[i][j]=INF;
for(int i=;i<;i++)nxt[m][i]=INF;
for(int i=m-;i>=;i--){
memcpy(nxt[i],nxt[i+],sizeof(nxt[i]));
nxt[i][b[i]-'a']=i;
}
solve();
int ans=;
for(int i=n;i;i--)
if(f[n-][i]<INF){
ans=i;
break;
}
cout<<ans;
}

100分 dp

魔方(模拟)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> int c[],n,flag=false,out[],ans; inline void read(int &now)
{
char Cget;now=;while((Cget=getchar())<''&&Cget>'');
while(Cget>=''&&Cget<='')now=now*+Cget-'',Cget=getchar();
} void operation_A()
{
int tmp,tmp2;
tmp=c[];
c[]=c[],c[]=c[],c[]=c[],c[]=tmp;
tmp=c[],tmp2=c[];
c[]=c[],c[]=c[],c[]=c[],c[]=c[];
c[]=c[],c[]=c[],c[]=tmp2,c[]=tmp;
} void operation_B()
{
int tmp,tmp2;
tmp=c[];
c[]=c[],c[]=c[],c[]=c[],c[]=tmp;
tmp=c[],tmp2=c[];
c[]=c[],c[]=c[],c[]=c[],c[]=c[];
c[]=c[],c[]=c[],c[]=tmp2,c[]=tmp;
} void operation_C()
{
int tmp=c[],tmp2;
c[]=c[],c[]=c[],c[]=c[],c[]=tmp;
tmp=c[],tmp2=c[];
c[]=c[],c[]=c[],c[]=c[],c[]=c[];
c[]=c[],c[]=c[],c[]=tmp,c[]=tmp2;
} bool check()
{
return c[]==c[]&&c[]==c[]&&c[]==c[]&&
c[]==c[]&&c[]==c[]&&c[]==c[]&&
c[]==c[]&&c[]==c[]&&c[]==c[]&&
c[]==c[]&&c[]==c[]&&c[]==c[]&&
c[]==c[]&&c[]==c[]&&c[]==c[]&&
c[]==c[]&&c[]==c[]&&c[]==c[];
} void dfs(int now,int last)
{
if(check())
{
flag=true,ans=now;
return;
}
if(now>=n) return;
if(last!=)
{
for(int i=;i<=;i++)
{
operation_A();
out[now+]=i;
dfs(now+,);
if(flag) return;
}
operation_A();
}
if(last!=)
{
for(int i=;i<=;i++)
{
operation_B();
out[now+]=+i;
dfs(now+,);
if(flag) return;
}
operation_B();
}
if(last!=)
{
for(int i=;i<=;i++)
{
operation_C();
out[now+]=+i;
dfs(now+,);
if(flag) return;
}
operation_C();
}
} void dfs2(int now,int last)
{
if(check())
{
flag=true,ans=now;
return;
}
if(now>=n) return;
if(last!=)
{
for(int i=;i<=;i++)
{
operation_A();
out[now+]=i;
dfs(now+,);
if(flag) return;
}
operation_A();
}
if(last!=)
{
for(int i=;i<=;i++)
{
operation_B();
out[now+]=+i;
dfs(now+,);
if(flag) return;
}
operation_B();
}
} int main()
{
freopen("cube.in","r",stdin);
freopen("cube.out","w",stdout);
read(n);
for(int i=;i<=;i++) read(c[i]);
if(n<=)
{
dfs(,);
for(int i=;i<=ans;i++) printf("%d ",out[i]);
}
else
{
if(n<=) dfs2(,);
if(!flag) dfs(,);
for(int i=;i<=ans;i++) printf("%d ",out[i]);
}
fclose(stdin),fclose(stdout);
return ;
}

100分 模拟

2017-10-5 清北刷题冲刺班p.m的更多相关文章

  1. 2017-10-4 清北刷题冲刺班p.m

    P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...

  2. 2017-10-4 清北刷题冲刺班a.m

    P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...

  3. 2017-10-3 清北刷题冲刺班p.m

    a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...

  4. 2017-10-3 清北刷题冲刺班a.m

    P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...

  5. 2017-10-2 清北刷题冲刺班a.m

    一道图论神题 (god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...

  6. 2017-10-2 清北刷题冲刺班p.m

    最大值 (max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...

  7. 2017-10-1 清北刷题冲刺班p.m

    一道图论好题 (graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...

  8. 2017-10-7 清北刷题冲刺班p.m

    测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...

  9. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

  10. 2017-10-1 清北刷题冲刺班a.m

    位运算1 (bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...

随机推荐

  1. SSH三大框架的搭建整合(struts2+spring+hibernate)(转)

    原文地址:http://blog.csdn.net/kyle0349/article/details/51751913  尊重原创,请访问原文地址 SSH说的上是javaweb经典框架,不能说100% ...

  2. codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)

    题目链接 题意:给出一个有n个数的序列,还有一个k,问在这个序列中有多少个子序列使得sum[l, r] = k^0,1,2,3…… 思路:sum[l, r] = k ^ t, 前缀和sum[r] = ...

  3. tomcat报错:Wrapper cannot find servlet class ...

    tomcat发布工程时,在浏览器输入正确的地址,遇到如下问题: HTTP Status 500 - javax.servlet.ServletException: Wrapper cannot fin ...

  4. MFC工程名称与所包含文件名称的关系(工程名可以更改,输出的.dll.exe.lib都以最后工程名命名为准)

    创建MFC应用程序时,可以规定MFC程序的工程名称,假设初始为MFCApp,则此后该应用程序的资源文件名称,继承自CWinApp的那个类,包括.def文件,.odl文件等都会以MFCApp打头. 但是 ...

  5. 【leetcode刷题笔记】ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  6. 【leetcode刷题笔记】N-Queens II

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  7. bzoj 4822~4824 CQOI2017题解

    老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...

  8. Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

    nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...

  9. HDU4699:Editor

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=46 ...

  10. Poj 2328 Guessing Game(猜数字游戏)

    一.题目大意 两个小盆友玩猜数字游戏,一个小盆友心里想着1~10中的一个数字,另一个小盆友猜.如果猜的数字比实际的大,则告诉他"too high",小则"too low& ...