每日总结-05-17

今天真是极度的不爽,非常不爽!。

今天下午加了一场训练赛。没想到加题加难了。

加完题晚上一直在写JSP的作业,怎么也写不完,怎么也写不出来。。。

晚上回到宿舍也一直再调,结果最后调好了。提交作业的时候发现提交时间截止了,怎么能这么悲伤。

------------------------------------------------------------------------------------------------------------------------------------------------------------

言归正传:

下午做了一场周赛。

我做了俩题。

1,zoj-3761-Easy billiards

枚举随意两个点,假设两个点能够互相打击,就把这两个点连起来。

最后暴力DFS寻找图中有几个联通块。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<vector>
using namespace std;
#define maxn 2200
struct list
{
    int x;
    int y;
    friend bool operator <(const list &a,const list &b)
    {
        if(a.x!=b.x)return a.x<b.x;
        else return a.y<b.y;
    }
} node[maxn];
vector<list>vec[maxn];
struct listt
{
    int x;
    int y;
    int f;
};
vector<listt>ans;
int maps[maxn][maxn];
int l;
int vis[maxn];
int n;
void dfs(int x,int pre)
{
    if(vis[x])return;
    vis[x]=1;
    for(int i=1;i<=n;i++)
    {
        if(maps[x][i]!=-1&&!vis[i])
        {
            dfs(i,x);
        }
    }
    if(pre==-1)return;
    struct listt p;
    p.x=node[x].x;
    p.y=node[x].y;
    if(p.x==node[pre].x)
    {
        if(p.y>node[pre].y)p.f=1;
        else p.f=2;
    }
    if(p.y==node[pre].y)
    {
        if(p.x>node[pre].x)
        {
            p.f=4;
        }
        else p.f=3;
    }
    ans.push_back(p);
}
int main()
{
    int i,j,k;
    while(~scanf("%d",&n))
    {
        if(n==0)
        {
            cout<<"0"<<endl;
            continue;
        }
        memset(maps,-1,sizeof(maps));
        memset(vis,0,sizeof(vis));
        for(i=1; i<=n; i++)
        {
            scanf("%d%d",&node[i].x,&node[i].y);
            vec[i].clear();
        }
        sort(node+1,node+n+1);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(node[i].x==node[j].x||node[i].y==node[j].y)maps[i][j]=1;
            }
        }
        ans.clear();
        int nums;
        nums=0;
        for(i=1;i<=n;i++)
        {
            if(vis[i])continue;
            dfs(i,-1);
            nums++;
        }
        cout<<nums<<endl;
        for(i=0;i<ans.size();i++)
        {
            struct listt p;
            p=ans[i];
            if(p.f==1)printf("(%d, %d) DOWN\n",p.x,p.y);
            else if(p.f==2)printf("(%d, %d) UP\n",p.x,p.y);
            else if(p.f==3)printf("(%d, %d) RIGHT\n",p.x,p.y);
            else printf("(%d, %d) LEFT\n",p.x,p.y);
        }
    }
    return 0;
}

2,zoj-3765-Lights

伸展树的模板题,没想到由于写搓了一个i。就TLE了10次。。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
#define maxn 350000
#define mem(a,b) memset(a,b,sizeof(a))
#define root10 ch[ch[root][1]][0]
#define root1 ch[root][1]
int pre[maxn],ch[maxn][2],root,tot;
int size[maxn];
int key[maxn];
int st[maxn];
int gcd1[maxn];
int gcd0[maxn];
int n;
int pos;
struct list
{
    int val;
    int st;
} node[maxn];
int gcd(int x,int y)
{
   // return 1;
    if(x<y)swap(x,y);
    if(y==0)return x;
    return gcd(y,x%y);
}
void init()
{
    root=tot=0;
    ch[root][0] = ch[root][1] = size[root] = pre[root] = 0;
    gcd0[root] = gcd1[root] = 0;
}
void newnode(int &x,int k,int father)
{
    x=++tot;
    pre[x]=father;
    size[x]=1;
    ch[x][0]=ch[x][1]=0;
    key[x]=node[k].val;
    st[x]=node[k].st;
    gcd0[x]=gcd1[x]=0;
    if(st[x]==0)gcd0[x]=node[k].val;
    else gcd1[x]=node[k].val;
    //cout<<gcd0[x]<<" "<<gcd1[x]<<endl;
}
void push_down(int x)
{

}
void push_up(int x)
{
    int ll=ch[x][0];
    int rr=ch[x][1];
    size[x]=size[ll]+size[rr]+1;
    gcd0[x]=gcd(gcd0[ll],gcd0[rr]);
    gcd1[x]=gcd(gcd1[ll],gcd1[rr]);
    if(st[x])gcd1[x]=gcd(gcd1[x],key[x]);
    else gcd0[x]=gcd(gcd0[x],key[x]);
}
void rot(int x,int kind)
{
    int y=pre[x];
    push_down(y);
    push_down(x);
    ch[y][!kind]=ch[x][kind];
    pre[ch[x][kind]]=y;
    if(pre[y])ch[pre[y]][ch[pre[y]][1]==y]=x;
    pre[x]=pre[y];
    ch[x][kind]=y;
    pre[y]=x;
    push_up(y);
    push_up(x);
}
void splay(int x,int goal)
{
    push_down(x);
    while(pre[x]!=goal)
    {
        if(pre[pre[x]]==goal)
        {
            push_down(pre[x]);
            push_down(x);
            rot(x,ch[pre[x]][0]==x);
        }
        else
        {
            int y=pre[x];
            push_down(pre[y]);
            push_down(y);
            push_down(x);
            int kind=ch[pre[y]][0]==y;
            if(ch[y][kind]==x)
            {
                rot(x,!kind);
                rot(x,kind);
            }
            else
            {
                rot(y,kind);
                rot(x,kind);
            }
        }
    }
    push_up(x);
    if(goal==0)root=x;
}
void buildtree(int &x,int l,int r,int father)
{
    if(l>r)return ;
    int mid=(l+r)/2;
    newnode(x,mid,father);
    buildtree(ch[x][0],l,mid-1,x);
    buildtree(ch[x][1],mid+1,r,x);
    push_up(x);
}
int get_kth(int x,int k)
{
    push_down(x);
    int p=size[ch[x][0]];
    if(p+1==k)return x;
    else if(k<=p)return get_kth(ch[x][0],k);
    else get_kth(ch[x][1],k-p-1);
}
int que(int l,int r,int st)
{
    int x=get_kth(root,l);
    splay(x,0);
    int y=get_kth(root,r+2);
    splay(y,root);
    int ans;
    if(st==0)ans=gcd0[root10];
    else ans=gcd1[root10];
    if(ans==0)return -1;
    else return ans;
}
void add(int x,int val,int st)
{
    int l=get_kth(root,x+1);
    splay(l,0);
    int r=get_kth(root,x+2);
    splay(r,root);
    n++;
    node[n].st=st;
    node[n].val=val;
    newnode(root10,n,root1);
    push_up(root1);
    push_up(root);
}
void del(int x)
{
    int xx=get_kth(root,x);
    splay(xx,0);
    int y=get_kth(root,x+2);
    splay(y,root);
    pre[root10]=0;
    root10=0;
    push_up(root1);
    push_up(root);
}
void resst(int x)
{
    int xx=get_kth(root,x);
    splay(xx,0);
    int y=get_kth(root,x+2);
    splay(y,root);
    st[root10]^=1;
    push_up(root10);
    push_up(root1);
    push_up(root);
}
void resval(int x,int vv)
{
    int xx=get_kth(root,x);
    splay(xx,0);
    int y=get_kth(root,x+2);
    splay(y,root);
    key[root10]=vv;
    push_up(root10);
    push_up(root1);
    push_up(root);
}
char str[101];
int main()
{
    int m,i,j,l,r,val,x;
    int stt;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        node[0].st=0;node[0].val=0;
        for(i=1; i<=n; i++)
        {
            scanf("%d%d",&node[i].val,&node[i].st);
        }
        newnode(root,0,0);
        newnode(root1,0,root);
        buildtree(root10,1,n,root1);
        push_up(root1);
        push_up(root);
        int ii;
        for(ii=1; ii<=m; ii++)
        {
            // debug();
            scanf("%s",str);
            if(str[0]==‘Q‘)
            {
                scanf("%d%d%d",&l,&r,&stt);
                printf("%d\n",que(l,r,stt));
            }
            if(str[0]==‘I‘)
            {
                scanf("%d%d%d",&i,&val,&stt);
                add(i,val,stt);
            }
            if(str[0]==‘D‘)
            {
                scanf("%d",&i);
                del(i);
            }
            if(str[0]==‘R‘)
            {
                scanf("%d",&i);
                resst(i);
            }
            if(str[0]==‘M‘)
            {
                scanf("%d%d",&i,&x);
                resval(i,x);
            }
        }
    }
    return 0;
}

---------------------------------------------------------------------

今天继续A了一个AC自己主动机的题目:

hdu-2296-Ring

须要记录路径,比較麻烦。

用string记录比較方便。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<string>
using namespace std;
const int maxnode=110*11;
const int childnum=26;
const int mod=20090717;
string path[55][maxnode];
struct ac_tree
{
    int chd[maxnode][childnum];
    int val[maxnode];
    int fail[maxnode];
    int Q[maxnode];
    int ID[128];
    int sz;
    int dp[55][maxnode];
    void init()
    {
        fail[0]=0;
        for(int i=0; i<childnum; i++)
        {
            ID[i+‘a‘]=i;
        }
    }
    void reset()
    {
        memset(chd,0,sizeof(chd));
        sz=1;
    }
    void insert(char str[],int k)
    {
        int p=0;
        int len=strlen(str);
        for(int i=0; i<len; i++)
        {
            int c=ID[str[i]];
            if(!chd[p][c])
            {
                memset(chd[sz],0,sizeof(chd[sz]));
                val[sz]=0;
                chd[p][c]=sz++;
            }
            p=chd[p][c];
        }
        val[p]=k;
      //  cout<<str<<" "<<p<<endl;
    }
    void ac_build()
    {
        int *s=Q,*e=Q;
        for(int i=0; i<childnum; i++)
        {
            if(chd[0][i])
            {
                fail[chd[0][i]]=0;
                *e++=chd[0][i];
            }
        }
        while(s!=e)
        {
            int u=*s++;
            for(int i=0; i<childnum; i++)
            {
                int &v=chd[u][i];
                if(v)
                {
                    *e++=v;
                    fail[v]=chd[fail[u]][i];
                   // val[v]=(val[v]+val[fail[v]]);
                }
                else v=chd[fail[u]][i];
            }
        }
    }
    void work(int n)
    {
        int ans=0;
        memset(dp,-1,sizeof(dp));
        dp[0][0]=0;
        for(int i=0; i<=n; i++)
            for(int j=0; j<sz; j++)
                path[i][j].clear();
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<sz; j++)
            {
                if(dp[i][j]==-1) continue;
                for(int k=0; k<26; k++)
                {
                    int cur=chd[j][k];
                    if(dp[i][j]+val[cur]>dp[i+1][cur])
                    {
                        dp[i+1][cur]=dp[i][j]+val[cur];
                        path[i+1][cur]=path[i][j]+(char)(k+‘a‘);
                    }
                    else if(dp[i][j]+val[cur]==dp[i+1][cur]&&path[i][j]+(char)(k+‘a‘)<path[i+1][cur])
                    {
                        path[i+1][cur]=path[i][j]+(char)(k+‘a‘);
                    }
                }
            }
        }
        for(int i=1; i<=n; i++)
            for(int j=0; j<sz; j++)
                ans=max(ans,dp[i][j]);
        if(ans==0)
        {
            puts("");
            return;
        }
       // cout<<ans<<endl;
        string str=" ";
        for(int i=1; i<=n; i++)
        for(int j=0; j<sz; j++)
        if(dp[i][j]==ans&&(str==" "||(path[i][j].size()<str.size()||(path[i][j].size()==str.size()&&path[i][j]<str)))) str=path[i][j];
        cout<<str<<endl;
    }
} AC;
char temp[110][15];
int main()
{
    AC.init();
    int n,m,k;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        AC.reset();
        for(int i=1; i<=m; i++)
        {
            scanf("%s",temp[i]);
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&k);
            AC.insert(temp[i],k);
        }
        //cout<<")"<<endl;
        AC.ac_build();
        AC.work(n);
    }
    return 0;
}
时间: 2024-10-28 20:55:53

每日总结-05-17的相关文章

每日一函数2015/05/17 ---2

onSaveInstanceState(Bundle outState) 这个方法或携带一个Bundle类型的参数,Bundle提过了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用pubInt()方法保存证书类型的数据,以此类推. 每个保存的方法需要传入两个参数,第一个参数是键值,用于红名从Bundle中取值,第二个参数是真正要保存的内容. 例如如下代码: protected void onSaveInstanceState(Bundle outstate) {

2016/05/17 thinkphp3.2.2 分页的使用:①在Home下设置Publics文件夹或在thinkPHP下library的vender 把page.class.php 考贝进入 ②通过new 实例化方式调用 $page=new \Home\Publics\Page($total,3);

注意分页的方法有两种:一种是thinkphp3.2 自带的   另一种是之前新闻页用过的     显示效果稍有差别 显示效果: 细节问题: ①搜索页面  要加session判断   和  分页 ②修改和添加页面需要有session判断 ③增删改的权限设置 控制器端: 1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class UserController extends Controller 5 { 6 public

2016/05/17 thinkphp3.2.2 ① Ajax 使用 ②前端验证

显示效果: ①Ajax使用:   注意传值的所有过程用的是小写,及时数据库列的名称中有大写字母 控制器部分: AjaxController.class.php 1 <?php 2 namespace Home\Controller; 3 use Think\Controller; 4 class AjaxController extends Controller 5 { 6 7 public function Ajax(){ 8 9 if (empty($_POST)) { 10 $this->

(16.05.17)ThinkPHP框架开发的应用的标准执行流程

用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导类(Think\Think)并执行Think::start方法进行应用初始化 设置错误处理机制和自动加载机制 调用Think\Storage类进行存储初始化(由STORAGE_TYPE常量定义存储类型) 部署模式下如果存在应用编译缓存文件则直接加载(直接跳转到步骤22) 读取应用模式(由APP_MODE常量定义)的定义文件(

每日一题17:八皇后问题

八皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.解题的思路如下:从棋盘的第一行起,先选择第一个格子作为第一个皇后的位置,然后在第二行中从第一个格子开始试探一个合适的位置放置第二个皇后,接下来在第三行从第一个格子开始试探一个合适的位置放置第三个皇

2018.05.17

今天去上了一节情商管理课程,实话实说,是我从小到大感触收获应该是最多的一门心理学课程,急着想回来写感受,所以课后没有找老师单独谈谈. 课上老师主要讲的是人的10种常见的心理歪曲,关于这10种心理歪曲我之后再慢慢整理,这里只想先记录下我的感想. 首先我会发现在这10种心理扭曲中,应该说70%以上成分都实际上是人针对自己所产生的一种我称作为"自我攻击性"的心理行为.主要的表现就是对自己总是要求很高,认为自己不如别人,放大消极的影响和情绪,从而让自己情绪处于一种消极状态,产生一种"

前端每日实战:17# 视频演示如何用纯 CSS 创作炫酷的同心矩形旋转动画

效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码. 请用 chrome, safari, edge 打开观看. https://scrimba.com/p/pEgDAM/cp2dZcQ 源代码下载 请从 github 下载. https://github.com/comehope/front-end-dai

每日算法-05(最长上升子序列)

求最长上升子序列 第一行输入一个数n,接下来一行,输入n个数值,求最长上升子序列: 输入例子: 5 2 1 8 3 6 输出: 3 解析:1 3 6 赶脚这个代码还是很菜,先上菜吧,开个胃,哈哈哈: import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(Syste

JavaSE学习总结第05天_Java语言基础1

05.01 方法概述和格式说明 简单的说:方法就是完成特定功能的代码块 在很多语言里面都有函数的定义,函数在Java中被称为方法 格式: 修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2...) {    函数体;    return 返回值; }   方法格式解释: 修饰符:后面会详细介绍.目前public static 返回值类型:用于限定返回值的数据类型 方法名:一个名称,方便我们调用方法 参数类型:限定调用方法时传入参数的数据类型 参数名:是一个变量,接收调用方法时传入的参数

vnstat 查看服务器带宽统计命令

vnStat是一个Linux下的网络流量监控软件,它记录指定网卡每日的传输流量日志. 它并非基于网络包的过滤,而是分析文件系统- /proc, 所以vnStat无需root的权限就可使用. ,它还自带了 vnstati 命令,通过它可以直接可以输出流量统计图. #先安装epel源 [[email protected] ~]# yum install epel-release -y #yum安装vnstat [[email protected] ~]# yum install vnstat -y