博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= =

T1:[TJOI2015]线性代数

描述:戳上面吧= =

首先这道题我觉得是这套题最漂亮的一道题了(虽然说学校的题库里居然有一道和这个一模一样的= =)

首先我们可以先把那个式子转化为其中b[i]是表示矩阵a中第i行为0或为1,然后就有两种方法转化为网络流啦

方法一:可以用最大权闭合子图的方法来考虑,将c[i]以及a[i][j]的选择与否视为事件的话,可以发现是一个点数为n*n的最大权闭合子图,就可以愉快的用网络流来搞辣

方法二:我们可以看做一个二元关系,因为可以看做i的选取会花费 c[i],而同时选择i, j则会获得一定的收益,那么我们可以得到一个二元关系(但还是需要经过一定的转化的),然后点数就只有n啦

我只写了方法一,虽说点数很多,但边数少,还是很快的

还有一种水法,貌似直接把所有a相加然后减去b就行辣(数据就是这么水= =)

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 300000
#define maxm 900000
struct edges{
int to,next,cap;
}edge[maxm*];
int next[maxn],l;
inline void addedge(int x,int y,int z) {
l++;
edge[l*]=(edges){y,next[x],z};next[x]=l*;
edge[l*+]=(edges){x,next[y],};next[y]=l*+;
}
#define inf 0x7fffffff
int s,t,h[maxn],p[maxn],gap[maxn];
int sap(int u,int flow) {
if (u==t) return flow;
int cnt=;
for (int i=p[u];i;i=edge[i].next)
if (edge[i].cap&&h[u]==h[edge[i].to]+) {
int cur=sap(edge[i].to,min(flow-cnt,edge[i].cap));
edge[i].cap-=cur;edge[i^].cap+=cur;
p[u]=i;
if ((cnt+=cur)==flow) return cnt;
}
if (!(--gap[h[u]])) h[s]=t;
gap[++h[u]]++;
p[u]=next[u];
return cnt;
}
inline int maxflow(){
for (int i=;i<=t;i++) p[i]=next[i];
memset(gap,,sizeof(gap));
memset(h,,sizeof(h));
gap[]=t;
int flow=;
while (h[s]<t) flow+=sap(s,inf);
return flow;
}
int id[][],cnt,n;
int main(){
freopen("algebra.in","r",stdin);
freopen("algebra.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j]=++cnt;
s=++cnt,t=++cnt;
int sum=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
int x;
scanf("%d",&x);
addedge(s,id[i][j],x);
sum+=x;
}
for (int i=;i<=n;i++) {
int x;
scanf("%d",&x);
addedge(id[][i],t,x);
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
addedge(id[i][j],id[][i],inf);
addedge(id[i][j],id[][j],inf);
}
printf("%d\n",sum-maxflow());
return ;
}

T2:[TJOI2015]组合数学

这是道结论题= =

某个啥啥定理说:DAG的最小链覆盖=最大独立点集,可见网格图的最大独立点集一定是从右上到左下的一条路径,那么我们就可以直接dp搞了

CODE:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1100
int f[maxn][maxn],a[maxn][maxn],T,n,m;
int main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
scanf("%d",&T);
while (T--) {
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%d",a[i]+j);
int ans=;
for (int i=n;i;i--)
for (int j=;j<=m;j++) {
f[i][j]=max(f[i][j-],max(f[i+][j-]+a[i][j],f[i+][j]));
ans=max(ans,f[i][j]);
}
printf("%d\n",ans);
}
return ;
}

T3:[TJOI2015]弦论

这道题嘛= =,50分算法是深圳市选题,然后100分的话我们可以用SAM来解决这个问题

首先我们先来考虑一下50分的算法,SAM上的每一个节点都表示该图中的一个子串,所以我们可以类似dp求出答案

而对于T=1的时候,可以发现重复的字串其实都在以parents树上该节点为根的子树

所以我们还是可以dp一下求出来

八中上被卡常数了,老调不出来

CODE:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1001000
char s[maxn];
typedef long long ll;
struct sam{
sam *pre,*ch[];
int val,cnt;ll size;
bool b;
}_t[maxn];
sam *root,*last;
int t,cnt;
inline void add(int x) {
sam *p=last;
_t[++cnt].val=last->val+;
sam *np=_t+cnt;
while (p&&p->ch[x]==) p->ch[x]=np,p=p->pre;
if (p==) np->pre=root;
else {
sam* q=p->ch[x];
if (p->val+==q->val) np->pre=q;
else {
_t[++cnt].val=p->val+;
sam*nq=_t+cnt;
memcpy(nq->ch,q->ch,sizeof(q->ch));
nq->pre=q->pre;
np->pre=q->pre=nq;
while (p&&p->ch[x]==q) p->ch[x]=nq,p=p->pre;
}
}
last=np;
}
inline void bfs(){
static sam* q[maxn];
q[]=root;
sam* u=q[];
int l,r;
for (l=r=;l<=r;u=q[++l]) {
for (int i=;i<;i++) {
if (!u->ch[i]||u->ch[i]->b) continue;
u->ch[i]->b=;
q[++r]=u->ch[i];
}
}
u=q[r];
for (int i=r;i;u=q[--i]) {
if (!t) u->cnt=;
if (i==) u->cnt=;
if (u->pre) u->pre->cnt+=u->cnt;
}
}
char ans[maxn];
int l;
void dfs(sam *p){
int i;
p->b=;
p->size=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(p->ch[i]->b==) dfs(p->ch[i]);
p->size+=p->ch[i]->size;
}
}
int k;
void get(sam *p){
int i;
if(k<=p->cnt) return ;
k-=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(k<=p->ch[i]->size){
ans[++l]=i+'a';
get(p->ch[i]);
return ;
}
k-=p->ch[i]->size;
}
}
int main(){
scanf("%s%d%d",&s,&t,&k);
root=_t;
root->val=;last=root;
int n=strlen(s);
for (int i=;i<n;i++) {
add(s[i]-'a');
last->cnt=;
}
bfs();
dfs(root);
if (root->size<k) {
printf("-1\n");
return ;
}
get(root);
printf("%s\n",ans+);
return ;
}

TJOI2015 day1解题报告的更多相关文章

  1. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  2. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  3. TJOI2015 day2解题报告

    TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...

  4. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  5. NOIP2018提高组Day1 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...

  6. NOIP 2017 Day1 解题报告

    总分:100分 T1,小凯的疑惑, 100分 T2,时间复杂度,0分 T3,逛公园,0分 T1 ###题意简化: 给定两个互质的数字,输出最大不能表示的数: 基础数论题目 代码: #include&l ...

  7. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  8. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  9. 2017.7.15清北夏令营精英班Day1解题报告

    成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu. ...

随机推荐

  1. 「LINUX资料」简单实用命令less和vi(三)

  2. Linux - tomcat -jndi数据源配置

    Linux - tomcat -jndi数据源配置 tomcat/conf/context .xml 文件中修改如下 <Resource name="/jdbc/--" au ...

  3. spark RDD编程,scala版本

    1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动 ...

  4. php字符串比较

    比较两个字符串是否相等,最常见的方法就是使用“===”来判断,至于它和“==”的区别,简单来说 就是前者强调“identical”类型也要求一样:后者要求“equal”,值相同就可以了.或者使用str ...

  5. 自定义浏览器滚动条的样式,打造属于你的滚动条风格——兼容IE和webkit(ff不支持)

    前段时间,到网上找素材时,看到了一个很个性的滚动条式,打开Chrome的调试工具看了一下,发现不是用JavaScript来模拟实现的,觉得 有必要折腾一下.于是在各大浏览器中对比了一下,发现只用Chr ...

  6. Java数据流的一般操作规律总结

    流的操作规律: 1,明确源和目的. 数据源:就是需要读取,可以使用两个体系:InputStream.Reader: 数据汇:就是需要写入,可以使用两个体系:OutputStream.Writer: 2 ...

  7. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...

  8. Eclipse 使用说明

    2. 使用技巧 2.1. Eclipse 打开文件所在文件夹 2.2. Mac 安装Eclipse 2.3. Eclipse 安装插件 2.4. Eclipse 工具栏不见了 2.5. Eclipse ...

  9. HTTP协议缓存策略深入详解之ETAG妙用

    Etag是什么: Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是使服务器控制的,就像Cookie那样. HTTP协议规格说明定义 ...

  10. 用NetStream的appendBytes播放FLV

    public class MiniStream extends Sprite { private var _buffer:ByteArray = new ByteArray(); private va ...