/*
可以看出,对于一段区间[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. private关键字

    Student.java /* * 学生类 * * 通过对象直接访问成员变量,会存在数据安全问题 * 这个时候,我们就想能不能不让外界对象直接访问成员变量呢? * 答案:能 * 如何实现呢? * pr ...

  2. Leetcode 137.只出现一次的数字II

    只出现一次的数字II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...

  3. Jquery EasyUI动态生成Tab

    function addTab(title, url) { if ($('#tt').tabs('exists', title)) { $('#tt').tabs('select', title); ...

  4. python之模块随笔记-sys

    模块名:sys sys.argv 实现从程序外部向程序传递参数 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.modules.keys() 返回所有已经导 ...

  5. linux下crontab安装和使用(定时任务)

    在Unix和Linux的操作系统之中,cron可以让系统在指定的时间,去执行某个指定的任务,crontab命令常用于管理对应的cron. 一.crontab在线安装 yum -y install vi ...

  6. MongoDB环境搭建教程收集(待实践)

    先收集,后续再实践. https://my.oschina.net/leezhen/blog/207262 http://www.360doc.com/content/11/0708/09/26606 ...

  7. [转]Attribute在.net编程中的应用

    Attribute在.net编程中的应用(一) Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是 ...

  8. springMVC多数据源使用 跨库跨连接

    原文:http://blog.itpub.net/9399028/viewspace-2106641/ http://blog.csdn.net/a973893384/article/details/ ...

  9. tplink wr886n v5.0 ttl 接线方法

    我的倒是有ttl信息,但是全是乱码,换过RX和TX,也换过串口速率都没用,附上TTL接线图. ==================================2016-11-02========= ...

  10. eclipse 开发jsp 智能提示设置

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 改动Auto Activation triggers for java的值为:.a ...