/*
可以看出,对于一段区间[L,R]如果统计了答案
若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理
所以两个指针分别从头尾往中间扫那边小移哪边即可。
*/
#include<bits/stdc++.h> #define N 1000007
#define ll long long using namespace std;
ll a[N];
ll n,m,ans,cnt; int main()
{
freopen("w.in","r",stdin);
freopen("w.out","w",stdout);
scanf("%lld",&n);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
int L=,R=n;
while(L<=R)
{
ll res=(R-L+)*min(a[L],a[R]);
ans=max(ans,res);
if(a[L]>=a[R]) R--;
else L++;
}
cout<<ans<<endl;
return ;
}

/*
发现算来算去所有数的二进制1的个数和位置不会变。
两个数and 或 or只是把他们的二进制位的1聚拢到一个数上。
若两个数为a,b,假设他们进行一次操作后变为(a+x),(b-x),则a>b
那么(a+x)^2+(b-x)^2=a^2+b^2+2x(x+a-b)>a^2+b^2
说明这种“聚拢”操作后平方和会变大
所以把所有数的二进制位1统计下来后尽可能的对分给一个数即可。
*/
#include<bits/stdc++.h> #define mod 998244353
#define N 10005 using namespace std;
int n,x;
int cnt[N]; int main()
{
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&x);
for (int j=;j<;j++) if (x & (<<j)) cnt[j]++;
}
unsigned long long ans=;
for(int i=;i<n;i++)
{
x=;
for(int j=;j<;j++) if (cnt[j]) x |=(<<j),cnt[j]--;
ans+=(unsigned long long)(x)*x%mod;;
}
cout<<ans%mod;
return ;
}

#include<bits/stdc++.h>

#define N 30
#define ll long long
#define mod 1000000007
#define opt 99999 using namespace std;
int n,m,k,lim;
ll ans;
int dx[]={,,,-};
int dy[]={,-,,};
int vis[N][N],f[N][N]; inline ll read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} bool can(int x,int y)
{
if(vis[x][y]==-) return false;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>=opt) return false;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>=opt) return false;
if(vis[x-][y-]>=opt || vis[x-][y+]>=opt) return false;
if(vis[x+][y+]>=opt || vis[x+][y-]>=opt) return false;
return true;
} void update(int x,int y)
{
vis[x][y]=opt;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]!=-)vis[x][i]++;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]!=-)vis[i][y]++;
if(x- && y- && vis[x-][y-]!=-) vis[x-][y-]++;
if(x- && y+<=m && vis[x-][y+]!=-) vis[x-][y+]++;
if(x+<=n && y- && vis[x+][y-]!=-) vis[x+][y-]++;
if(x+<=n && y+<=m && vis[x+][y+]!=-) vis[x+][y+]++;
} void _update(int x,int y)
{
vis[x][y]=;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>)vis[x][i]--;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>)vis[i][y]--;
if(vis[x-][y-]>)vis[x-][y-]--;
if(vis[x-][y+]>)vis[x-][y+]--;
if(vis[x+][y-]>)vis[x+][y-]--;
if(vis[x+][y+]>)vis[x+][y+]--;
f[x][y]=;
} void dfs(int x,int y,int L)
{
if(L==)
{
ans++;ans%=mod;
return;
}
for(int xx=x;xx<=n;xx++) for(int yy=;yy<=m;yy++)
{
if(f[xx][yy]) continue;
if(vis[xx][yy]<opt && can(xx,yy) && !f[xx][yy])
{
update(xx,yy);
f[xx][yy]=;
dfs(xx,yy,L-);
_update(xx,yy);//dfs(xx,yy,L);
}
}
} int main()
{
freopen("l.in","r",stdin);
freopen("l.out","w",stdout);
int x,y;ans=;
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
x=read();y=read();
vis[x][y]=-;
}
lim=n*m-k;
while(lim--)
{
memset(f,,sizeof f);
f[][]=;
dfs(,,lim);
}
ans%=mod;cout<<ans<<endl;
return ;
}

没调出来的dfs

#include <cstdio>
#include <cstring>
#include <vector> const int MAXN = ;
const int MOD = 1e9 + ; int m; inline unsigned int getBit(int i) {
return 1u << i;
} inline bool isValidLine(unsigned int s) {
return !((s & (s << )) || (s & (s << )));
} inline bool isValidTwoLines(unsigned int a, unsigned int b) {
return !((a & (b << )) || (a & (b >> )) || (a & b));
} inline bool isValidThreeLines(unsigned int a, unsigned int b, unsigned int c) {
return !(a & c) && isValidTwoLines(a, b)/* && isValidTwoLines(b, c)*/;
} int main() {
freopen("l.in", "r", stdin);
freopen("l.out", "w", stdout); int n, k;
scanf("%d %d %d", &n, &m, &k); unsigned int ban[n + ];
memset(ban, , sizeof(ban));
while (k--) {
int i, j;
scanf("%d %d", &i, &j);
ban[i] |= << (j - );
} std::vector<unsigned int> validStates; unsigned int maxS = << m;
for (int i = ; i < maxS; i++) {
if (isValidLine(i)) {
validStates.push_back(i);
}
} // f[i][state of line i - 1][state of line i] = count
long long f[n + ][validStates.size()][validStates.size()]; memset(f, , sizeof(f));
for (int a = ; a < (int)validStates.size(); a++) f[][][a] = ; long long ans = ;
for (int i = ; i <= n; i++) {
for (int c = ; c < (int)validStates.size(); c++) {
if (ban[i] & validStates[c]) continue;
for (int b = ; b < (i <= ? : (int)validStates.size()); b++) {
if (!isValidTwoLines(validStates[b], validStates[c])) continue;
if (ban[i - ] & validStates[b]) continue; for (int a = ; a < (i <= ? : (int)validStates.size()); a++) {
if (!isValidThreeLines(validStates[a], validStates[b], validStates[c])) continue;
if (a && (ban[i - ] & validStates[a])) continue; (f[i][b][c] += f[i - ][a][b]) %= MOD;
} if (i == n) (ans += f[i][b][c]) %= MOD;
}
}
} printf("%lld\n", ans);
}

std

暂时放弃  先做完互不侵犯king再来写这道题

10.11NOIP模拟题(3)的更多相关文章

  1. 10.11NOIP模拟题(2)

    /* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...

  2. 9.11NOIP模拟题

    NOIP模拟赛 by thmyl   题目名称 superman market Lemon_Soda 可执行文件名 superman market Lemon_Soda 输入文件 superman.i ...

  3. 10.13NOIP模拟题

    /* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...

  4. 10.23NOIP模拟题

    叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...

  5. 10.9NOIP模拟题

    /* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...

  6. 10.12NOIP模拟题(2)

    /* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...

  7. 10.12NOIP模拟题(1)

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...

  8. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  9. poj 1888 Crossword Answers 模拟题

    Crossword Answers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 869   Accepted: 405 D ...

随机推荐

  1. HDU-2817,同余定理+快速幂取模,水过~

    A sequence of numbers                                                             Time Limit: 2000/1 ...

  2. CentOS下LVS DR模式负载均衡配置详解

    一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...

  3. Ubuntu 16.04 LTS GNOME版本下载

    下载地址: http://cdimage.ubuntu.com/ubuntu-gnome/releases/ Ubuntu GNOME发行版本启动已经有三年的时间了,在社区用户对于在稳定可靠的Ubun ...

  4. Ubuntu 16.04安装UML工具StarUML 2

    StarUML 2是一个商业软件,但是没有时间限制,就像Sublime Text 3一样.而且具有跨平台,支持Mac.Windows. 这个软件曾经08年的时候在老D的博客上有推荐过,参考:http: ...

  5. Ubuntu 16.04安装***-qt5

    上一篇文章http://www.cnblogs.com/EasonJim/p/7133097.html中,第5步安装本地代理源服务器使用的是electron-ssr,发觉这个东西难配且难用,非常不建议 ...

  6. how to read openstack code: Neutron architecture

    今天这一章节非常重要.我们知道neutron是一个非常复杂的系统,由很多组件构成.研究这样一个复杂的系统,正确的顺序应该是现在宏观上对其整体结构有所了解,然后再由针对性的对其组件进行深入了解.本章要做 ...

  7. python之SocketServer编程

    编写一个SocketServer需要实现以下步骤 编写一个handler类,继承BaseRequestHandler,重写handle()方法 针对是TCP还是UDP,生成一个server对象 调用s ...

  8. HDU 5407 CRB and Candies(LCM +最大素因子求逆元)

    [题目链接]pid=5407">click here~~ [题目大意]求LCM(Cn0,Cn1,Cn2....Cnn)%MOD 的值 [思路]来图更直观: 这个究竟是怎样推出的.说实话 ...

  9. Android 4.2 project导入 5.0 SDK Eclipse 开发环境出现的问题总结

    Android 4.2 project导入 5.0 SDK Eclipse 开发环境出现的问题总结 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循&qu ...

  10. 【C语言】推断一个数是否为2的n次方

    //推断一个数是否为2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一个1,推断 ...