行列式

序列

#include<iostream>
#include<cstdio>
#define maxn 500010
using namespace std;
int n,m,mod,l,r,x,y,b[maxn],a[maxn],cnt;
void dfs(int now[],int sz){
if(sz<=){
for(int i=;i<=sz;i++)b[++cnt]=now[i];
return;
}
int sz1=,sz2=;
int d[sz],c[sz];
for(int i=;i<=sz;i++){
if(i%!=){//奇数位
c[++sz1]=now[i];
}
if(i%==){//偶数位
d[++sz2]=now[i];
}
}
dfs(c,sz1);
dfs(d,sz2);
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);
scanf("%d%d%d",&n,&m,&mod);
for(int i=;i<=n;i++)a[i]=i;
dfs(a,n);
long long ans;
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&l,&r,&x,&y);
ans=;
if(x>y)swap(x,y);
for(int j=l;j<=r;j++){
if(b[j]<=y&&b[j]>=x){
ans=(ans+b[j])%mod;
}
}printf("%I64d\n",ans);
}
fclose(stdin);fclose(stdout);
return ;
}

30分 暴力

/*
考虑类似线段树的求解方法,记 getans(n,l,r,x,y) 表示当前在 F 中,是 1 到 n 的升序
排列,需要求得最终排好序后 l 到 r 范围内,大小在 x 到 y 之间的数值之和以及数字个数
(getans 返回一个 pair) ,思考如何分治。
注意到左右分裂的规律,可以算出此时序列需要向左边和右边分出多少,同时可以知道
l,r,x,y 四个数在子区间的大小,分治下去求解。在回溯时,将左右子树答案合并即可。
注意如果实现过程中会有类平方运算,可能会超 Long Long 范围,需要特别注意处理。
具体实现详见代码,复杂度为 O(M logN)。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
using namespace std;
struct node{
long long a,b;
};
long long n,m,mod,l,r,u,v;
node make_node(long long x,long long y){
node w;
w.a=x;w.b=y;
return w;
}
node solve(long long rr,long long l,long long r,long long x,long long y){
if(x>rr||l>r)return make_node(,);
if(l==&&r==rr){
x=max(x,1LL);
y=min(y,rr);
long long s;
if((x+y)%==)s=((x+y)/)%mod*((y-x+)%mod)%mod;
else s=((x+y)%mod)*((y-x+)/%mod)%mod;
return make_node(s%mod,y-x+);
}
long long mid=(rr+)/;
if(r<=mid){
node res=solve(mid,l,r,x/+,(y+)/);
return make_node((res.a*-res.b)%mod,res.b);
}
else if(l>mid){
node res=solve(rr-mid,l-mid,r-mid,(x+)/,y/);
return make_node(res.a*%mod,res.b);
}
else{
node res1=solve(mid,l,mid,x/+,(y+)/);
node res2=solve(rr-mid,,r-mid,(x+)/,y/);
return make_node((res1.a*-res1.b+res2.a*)%mod,(res1.b+res2.b)%mod);
}
}
int main(){
freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf(LL LL LL,&n,&m,&mod);
for(int i=;i<m;i++){
scanf(LL LL LL LL,&l,&r,&u,&v);
node ans=solve(n,l,r,u,v);
printf(LL"\n",(ans.a+mod)%mod);
}
return ;
}

100分

数数(倍增)

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 100010
using namespace std;
int num,head[maxn];
int sz[maxn],son[maxn],fa[maxn],top[maxn],dep[maxn];
long long ans;
struct node{
int to,pre;
}e[maxn*];
int n,dis[][];
bool vis[maxn];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
void Bfs(int s){
queue<int>q;
memset(vis,,sizeof(vis));
vis[s]=;q.push(s);dis[s][s]=;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(vis[to])continue;
else {
dis[s][to]=dis[s][now]+;
vis[to]=;
q.push(to);
}
}
}
}
int count(int x){
int res=;
while(x){
res+=x&;
x>>=;
}
return res;
}
void dfs1(int now,int father){
dep[now]=dep[father]+;
sz[now]=;fa[now]=father;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==father)continue;
dfs1(to,now);
sz[now]+=sz[to];
if(!son[now]||sz[son[now]]<sz[to])son[now]=to;
}
}
void dfs2(int now,int father){
top[now]=father;
if(son[now])dfs2(son[now],father);
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==fa[now]||to==son[now])continue;
dfs2(to,to);
}
}
int LCA(int a,int b){
while(top[a]!=top[b]){
if(dep[top[a]]<dep[top[b]])swap(a,b);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
return a;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("bitcount.in","r",stdin);freopen("bitcount.out","w",stdout);
scanf("%d",&n);
int x,y;
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
Insert(x,y);Insert(y,x);
}
for(int i=;i<=n;i++)Bfs(i);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=count(dis[i][j]);
dfs1(,);
dfs2(,);
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int lca=LCA(i,j);
ans+=dis[i][lca]+dis[j][lca];
}
}
cout<<ans;
fclose(stdin);fclose(stdout);
return ;
}

60分 暴力

/*
记 l(i,j) 表示 i 号节点向上 2^j 步的祖先节点。
记 f(i,j) 表示到 i 号节点,上一步长为 2^j 的数位之和。
记 g(i,j) 表示到 i 号节点,上一步长为 2^j 的方案数。
考虑转移方程:
g(i,j) → g(l(i,k),k),k < j
f(i,j) + g(i,j) → f(l(i,k),k),k < j
由于难以查询某一节点子树中深度为 d 的节点,该方程用自下而上更新的方法比较方便。
而 Ans 也很难用一个简洁的式子表示出,故在模拟向上跳跃的时候同步更新。
具体细节详见代码,复杂度 O(N log^2 N)。
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <vector> #define st first
#define nd second
using namespace std; struct edge {
int x;
int nxt;
};
typedef long long LL; const int N = 1E5 + ;
edge e[ * N];
int lca[N][], hd[N], fa[N], sons[N], nxt[N], cnt[N][], f[N][];
int n, m, x, y, l;
LL ans; void link(int x, int y) {
e[++l].x = y;
e[l].nxt = hd[x];
hd[x] = l;
} void dfs_lca(int x) {
lca[x][] = fa[x];
sons[x] = ;
for (int i = ; i <= ; ++i)
lca[x][i] = lca[lca[x][i - ]][i - ];
for (int p = hd[x]; p; p = e[p].nxt)
if (e[p].x != fa[x]) {
fa[e[p].x] = x;
dfs_lca(e[p].x);
sons[x] += sons[e[p].x];
}
} void dfs_ans(int x) {
for (int p = hd[x]; p; p = e[p].nxt)
if (e[p].x != fa[x]) nxt[x] = e[p].x, dfs_ans(e[p].x);
for (int i = ; i <= ; ++i) {
ans += sons[lca[x][i]] - sons[nxt[lca[x][i]]];
cnt[lca[x][i]][i]++;
f[lca[x][i]][i]++;
}
for (int i = ; i <= ; ++i)
for (int j = ; j <= i - ; ++j) {
ans += LL(cnt[x][i] + f[x][i]) * LL(sons[lca[x][j]] - sons[nxt[lca[x][j]]]);
cnt[lca[x][j]][j] += cnt[x][i];
f[lca[x][j]][j] += f[x][i] + cnt[x][i];
}
} int main() {
freopen("bitcount.in", "r", stdin);
freopen("bitcount.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i < n; ++i) {
scanf("%d%d", &x, &y);
link(x, y);
link(y, x);
}
dfs_lca();
sons[] = sons[];
nxt[] = ;
dfs_ans();
printf("%I64d\n", ans);
}

100分 倍增

2017-10-5 清北刷题冲刺班a.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. 再次理解WCF以及其通信(附加一個編程小經驗)

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  2. Java微信开发_Exception_02_"errcode":40164,"errmsg":"invalid ip 61.172.68.219, not in whitelist hint

    ip查询网址: http://www.ip.cn/ 一.异常现象 今天开始做微信开发,在办公室时能正常获取access_token,晚上回家之后获取access_token时却报出下列错误信息: {& ...

  3. Gym 101142G : Gangsters in Central City(DFS序+LCA+set)

    题意:现在有一棵树,1号节点是水源,叶子节点是村庄,现在有些怪兽会占领一些村庄(即只占领叶子节点),现在要割去一些边,使得怪兽到不了水源.给出怪兽占领和离开的情况,现在要割每次回答最小的割,使得怪兽不 ...

  4. 左右选择框 js插件

    随着项目的进展,测试工程师在更多的浏览器中兼容性测试中,发现有些浏览器不支持option的触发事件,这就造成了先前一篇博文bootstrap 左右框多项选择示例 中左右选择框的失效,于是我就由原先的s ...

  5. bzoj 1006: 神奇的国度 MCS

    题目大意: 弦图的最小染色. 题解: 裸题. #include <vector> #include <cstdio> #include <cstring> #inc ...

  6. 【Facebook】等差子序列个数

    题目: 给定一整数数列,问数列有多少个子序列是等差数列. 即对于包含N个数的数列A,A(0),A(1),……,A(N-1),有多少组(P(0),P(1),……,P(k))满足0<=P(0)< ...

  7. Error Domain=NSURLErrorDomain Code=-1202,Https服务器证书无效

    错误:“此服务器的证书无效.您可能正在连接到一个伪装成“www.xxxxxx.com”的服务器, 这会威胁到您的机密信息的安全 原因:安全证书是自建证书,没有得到认证. 解决方法: 1.导入NSURL ...

  8. 删除文件时提示 你需要来自system的权限才能对此文件夹进行更改

    问题描述: 我的计算机是Win7 x64操作系统,在我的计算机的F盘中,不知道什么时候多了个“12e4k69m762nzcgt8zx”这样一个文件夹,应该是某个软件自己创建并留下的文件夹,想删除掉则提 ...

  9. Ruby中的%表示法

     %{String}  用于创建一个使用双引号括起来的字符串,这个表示法与%Q{String}完全一样 result = %{hello} puts "result is: #{result ...

  10. VisualGDB系列5:使用VS来开发Linux程序

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文演示如何使用VS来构建和调试Linu ...