pipioj 1295: 一元多项式乘法

http://www.pipioj.online/problem.php?id=1295

  1 #define bug(x) cout<<#x<<" is "<<x<<endl
  2 #define IO std::ios::sync_with_stdio(0)
  3 #include<bits/stdc++.h>
  4 using namespace std;
  5 #define ll long long
  6 const int N=3e5+10;
  7 typedef struct LinkNode{
  8     int co;
  9     int ex;
 10     LinkNode *next;
 11 }LinkNode,*LinkList;
 12 void attach(int co,int ex,LinkNode *&r){
 13     LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
 14     p->co=co;
 15     p->ex=ex;
 16     p->next=NULL;
 17     r->next=p;
 18     r=p;
 19 }
 20 LinkList mutiply(LinkList L1,LinkList L2){
 21     LinkNode *front=(LinkNode *)malloc(sizeof(LinkNode));
 22     LinkNode *rear=front;
 23     front->next=NULL;
 24     LinkNode *r1=L1->next;
 25     LinkNode *r2=L2->next;
 26     while(r1){
 27         rear=front;
 28         while(r2){
 29             int co=r1->co*r2->co;
 30             int ex=r1->ex+r2->ex;
 31             while(rear->next&&ex>rear->next->ex){
 32                 rear=rear->next;
 33             }
 34             if(rear->next&&ex==rear->next->ex){
 35                 if(co+rear->co==0){
 36                     LinkNode *p=rear->next;
 37                     rear->next=p->next;
 38                     free(p);
 39                 }
 40                 else{
 41                     rear->next->co+=co;
 42                 }
 43             }
 44             else{
 45                 if(co!=0){
 46                     LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
 47                     p->co=co;
 48                     p->ex=ex;
 49                     p->next=rear->next;
 50                     rear->next=p;
 51                     rear=rear->next;
 52                 }
 53             }
 54             r2=r2->next;
 55         }
 56         r1=r1->next;
 57         r2=L2->next;
 58     }
 59     return front;
 60 }
 61 struct node{
 62     int x,y;
 63 }a[N],b[N];
 64 bool cmp(node p,node q){
 65     return p.y<q.y;
 66 }
 67 int work(node p[],int n1){
 68     sort(p+1,p+1+n1,cmp);
 69     int g1=0,n2=0;
 70     for(int i=1;i<=n1;i++){
 71         if(i==n1){
 72             p[++n2].y=p[i].y;
 73             p[n2].x=g1+p[i].x;
 74             break;
 75         }
 76         if(p[i+1].y==p[i].y){
 77             g1+=p[i].x;
 78         }
 79         else{
 80             p[++n2].y=p[i].y;
 81             p[n2].x=g1+p[i].x;
 82             g1=0;
 83         }
 84     }
 85     return n2;
 86 }
 87 void print(LinkNode *p){
 88     if(p->next)print(p->next);
 89     cout<<p->co<<" "<<p->ex<<" ";
 90 }
 91 int n,m;
 92 int main(){
 93     IO;
 94     LinkList L1,L2;
 95     L1=(LinkList)malloc(sizeof(LinkNode));
 96     L2=(LinkList)malloc(sizeof(LinkNode));
 97     L1->next=NULL;
 98     L2->next=NULL;
 99     LinkNode *r1=L1,*r2=L2;
100     cin>>n;
101     for(int i=1;i<=n;i++){
102         cin>>a[i].x>>a[i].y;
103     }
104     int n1=0,n2=0;
105     n1=work(a,n);
106     for(int i=1;i<=n1;i++){
107         attach(a[i].x,a[i].y,r1);
108     }
109     cin>>m;
110     for(int i=1;i<=m;i++){
111         cin>>b[i].x>>b[i].y;
112     }
113     n2=work(b,m);
114     for(int i=1;i<=n2;i++){
115         attach(b[i].x,b[i].y,r2);
116     }
117     LinkList L3=mutiply(L1,L2);
118     L3=L3->next;
119     if(!L3)cout<<"0 0";
120     else print(L3);
121 }
122 /*
123 3
124 1 3 2 2 4 3
125 3
126 1 7 2 6 3 5
127 */

 更新:

  1 #define bug(x) cout<<#x<<" is "<<x<<endl
  2 #define IO std::ios::sync_with_stdio(0)
  3 #include<bits/stdc++.h>
  4 using namespace std;
  5 #define ll long long
  6 const int N=3e5+10;
  7 typedef struct LinkNode{
  8     int co;
  9     int ex;
 10     LinkNode *next;
 11 }LinkNode,*LinkList;
 12 void attach(int co,int ex,LinkNode *&r){
 13     LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
 14     p->co=co;
 15     p->ex=ex;
 16     p->next=NULL;
 17     r->next=p;
 18     r=p;
 19 }
 20 LinkList mutiply(LinkList L1,LinkList L2){
 21     LinkNode *front=(LinkNode *)malloc(sizeof(LinkNode));
 22     LinkNode *rear=front;
 23     front->next=NULL;
 24     LinkNode *r1=L1->next;
 25     LinkNode *r2=L2->next;
 26     while(r1){
 27         while(r2){
 28             int co=r1->co*r2->co;
 29             int ex=r1->ex+r2->ex;
 30             attach(co,ex,rear);
 31             r2=r2->next;
 32         }
 33         r1=r1->next;
 34         r2=L2->next;
 35     }
 36     return front;
 37 }
 38 struct node{
 39     int x,y;
 40 }a[N],b[N],c[N];
 41 bool cmp(node p,node q){
 42     return p.y<q.y;
 43 }
 44 int work(node p[],int n1){
 45     sort(p+1,p+1+n1,cmp);
 46     int g1=0,n2=0;
 47     for(int i=1;i<=n1;i++){
 48         if(i==n1){
 49             p[++n2].y=p[i].y;
 50             p[n2].x=g1+p[i].x;
 51             break;
 52         }
 53         if(p[i+1].y==p[i].y){
 54             g1+=p[i].x;
 55         }
 56         else{
 57             p[++n2].y=p[i].y;
 58             p[n2].x=g1+p[i].x;
 59             g1=0;
 60         }
 61     }
 62     return n2;
 63 }
 64 int n,m;
 65 int main(){
 66     IO;
 67     LinkList L1,L2;
 68     L1=(LinkList)malloc(sizeof(LinkNode));
 69     L2=(LinkList)malloc(sizeof(LinkNode));
 70     L1->next=NULL;
 71     L2->next=NULL;
 72     LinkNode *r1=L1,*r2=L2;
 73     cin>>n;
 74     for(int i=1;i<=n;i++){
 75         cin>>a[i].x>>a[i].y;
 76     }
 77     int n1=0,n2=0,n3=0,n4=0,f=0;
 78     n1=work(a,n);
 79     for(int i=1;i<=n1;i++){
 80         attach(a[i].x,a[i].y,r1);
 81     }
 82     cin>>m;
 83     for(int i=1;i<=m;i++){
 84         cin>>b[i].x>>b[i].y;
 85     }
 86     n2=work(b,m);
 87     for(int i=1;i<=n2;i++){
 88         attach(b[i].x,b[i].y,r2);
 89     }
 90     LinkList L3=mutiply(L1,L2);
 91     L3=L3->next;
 92     while(L3){
 93         c[++n3].x=L3->co;
 94         c[n3].y=L3->ex;
 95         L3=L3->next;
 96     }
 97     n4=work(c,n3);
 98     for(int i=n4;i>1;i--){
 99         if(c[i].x==0)continue;
100         f=1;
101         cout<<c[i].x<<" "<<c[i].y<<" ";
102     }
103     if(c[1].x!=0)cout<<c[1].x<<" "<<c[1].y,f=1;
104     if(!f)cout<<"0 0";
105 }
106 /*
107 3
108 1 3 2 2 4 3
109 3
110 1 7 2 6 3 5
111 
112 2
113 3 2
114 3 2
115 2
116 0 2
117 0 1
118 */
原文地址:https://www.cnblogs.com/ccsu-kid/p/13770076.html